DELL PowerEdge R740xd - NUMA - 内存性能

DELL PowerEdge R740xd - NUMA - 内存性能

我有两台物理数据库服务器(均为 Windows Server 2016):

测试服务器(5 年):DELL PowerEdge R730xd、1x Intel(R) Xeon(R) CPU E5-2637 v4 @ 3.50GHz(4C/8T)、192 GB RAM(12x 16GB PC4-17000 - 36ASF2G72PZ-2G1A2)- 一个 NUMA 节点

生产服务器(半年):DELL PowerEdge R740xd、2x Intel(R) Xeon(R) Gold 6128 CPU @ 3.40GHz(6C/12T)、512 GB RAM(16x 32GB PC4-21300 - 36ASF4G72PZ-2G6E1)- 两个 NUMA 节点(每个 NUMA 节点上有 256 GB RAM)

两台服务器都在 BIOS 中选择了性能配置文件。

我是 Oracle DBA,我注意到我的测试服务器在某些仅使用 RAM(而不是存储系统)的查询中速度更快。我真的很失望,因为我 5 年前的测试服务器比新的更快。我认为我的问题与 NUMA 有关,因为测试服务器是一个 NUMA 节点系统,而生产有两个 NUMA 节点。

我在 Oracle 中做了很多测试,但我也在 Oracle 之外做了一个简单的测试来验证我的建议。一个简单的 PHP 脚本,循环分配 cca 2GB 内存并再次释放它:

<?php
for($n=0;$n<=10000;$n++){
  $start = microtime(true);
  for ($i = 0; $i < 50000000; ++$i) {
      $arr[] = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  }
  //echo (memory_get_usage()/1024/1024).PHP_EOL;
  echo (microtime(true) - $start).PHP_EOL;
  unset($arr);
}

在我的测试服务器上,一次迭代运行大约 1.7 秒,在我的生产服务器上运行 2.0 到 2.6 秒,如果我将处理器亲和性设置为 NUMA 节点 1,则为 1.9 秒。

我不是硬件专家,所以你能帮我调整内存子系统吗?我想到的是 BIOS 设置、节点交错、Windows 调整等。我不敢相信 PC4-21300 比 PC4-17000 慢——有人能解释一下这种行为吗?如果您需要,我可以为您提供一些其他信息——我当前的 BIOS 设置等。

答案1

这显然是一个迟来的答案,但我偶然遇到了这个问题。我专门在工作中做很多这方面的工作,不幸的是,关于进行 NUMA 测试的完整答案很长而且很微妙。以下是一些需要考虑的一般事项:

  1. 这并非不可能,但在现代的 NUMA 感知操作系统上,操作系统只是将进程分配给错误的 NUMA 节点,这种情况不太可能发生。通常,当涉及 PCIe 设备(如 GPU 或 NVMe 驱动器)时,您最常看到该问题,这些设备通过主板连接到一个进程,但进程在相反的进程上运行。如果您认为这是一个问题,您可以检查 NUMA 状态。如果您遇到 NUMA 未命中,您通常会看到 other_node 或 numa_foreign 的计数很高(并且还在上升),尽管这取决于一些因素。请参阅这个 Linux 文档以获得更详细的解释。
[root@r7525 ~]# numastat
                           node0           node1           node2           node3
numa_hit                     460             460          397706          414740
numa_miss                      0               0               0               0
numa_foreign                   0               0               0               0
interleave_hit                 0               0           10633           10567
local_node                     0               0          226751           76898
other_node                   460             460          170955          337842

                           node4           node5           node6           node7
numa_hit                  423211          295925             460             460
numa_miss                      0               0               0               0
numa_foreign                   0               0               0               0
interleave_hit             10645           10559               0               0
local_node                256692          247405               0               0
other_node                166519           48520             460             460

                           node8           node9          node10          node11
numa_hit                     460             460          692597          494990
numa_miss                      0               0               0               0
numa_foreign                   0               0               0               0
interleave_hit                 0               0           10634           10577
local_node                     0               0          283516          274249
other_node                   460             460          409081          220741

                          node12          node13          node14          node15
numa_hit                  269866          227927             460             460
numa_miss                      0               0               0               0
numa_foreign                   0               0               0               0
interleave_hit             10622           10565               0               0
local_node                103034           87552               0               0
other_node                166832          140374             460             460
  1. 您可以使用 检查 NUMA 布局numactl --hardware。注意:请注意物理 NUMA 节点与您在操作系统中看到的节点之间存在差异。例如:R7525,每个插槽的 NUMA 设置为 4,有 8 个物理 NUMA 节点。如果您将 L3 缓存启用为 NUMA,可能会多一些。但是,您在操作系统中看到的是:
[root@r7525 ~]# numactl --hardware
...SNIP...
node   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
  0:  10  11  12  12  12  12  12  12  32  32  32  32  32  32  32  32
  1:  11  10  12  12  12  12  12  12  32  32  32  32  32  32  32  32
  2:  12  12  10  11  12  12  12  12  32  32  32  32  32  32  32  32
  3:  12  12  11  10  12  12  12  12  32  32  32  32  32  32  32  32
  4:  12  12  12  12  10  11  12  12  32  32  32  32  32  32  32  32
  5:  12  12  12  12  11  10  12  12  32  32  32  32  32  32  32  32
  6:  12  12  12  12  12  12  10  11  32  32  32  32  32  32  32  32
  7:  12  12  12  12  12  12  11  10  32  32  32  32  32  32  32  32
  8:  32  32  32  32  32  32  32  32  10  11  12  12  12  12  12  12
  9:  32  32  32  32  32  32  32  32  11  10  12  12  12  12  12  12
 10:  32  32  32  32  32  32  32  32  12  12  10  11  12  12  12  12
 11:  32  32  32  32  32  32  32  32  12  12  11  10  12  12  12  12
 12:  32  32  32  32  32  32  32  32  12  12  12  12  10  11  12  12
 13:  32  32  32  32  32  32  32  32  12  12  12  12  11  10  12  12
 14:  32  32  32  32  32  32  32  32  12  12  12  12  12  12  10  11
 15:  32  32  32  32  32  32  32  32  12  12  12  12  12  12  11  10

这是因为每个物理处理器也运行同步多线程 (SMT),因此每个物理处理器会呈现两个单独的逻辑处理器,并呈现两个 NUMA 节点。有一个很好的脚本这里显示哪两个兄弟线程:

for core in {0..63}; do
  echo -en "$core\t"
  cat /sys/devices/system/cpu/cpu$core/topology/thread_siblings_list
done

R7525 有 64 个物理核心,因此您会看到以下内容:

0       0,64
1       1,65
2       2,66
3       3,67
4       4,68
5       5,69
6       6,70
7       7,71
8       8,72
...SNIP...
59      59,123
60      60,124
61      61,125
62      62,126
63      63,127
  1. 如果你确实有 PCIe 卡,你可以使用“lstopo -v | grep -Ei 'pci|sd|numa'”检查 PCIe 卡的 NUMA 对齐
...SNIP...
 PCIBridge L#1 (busid=0000:60:03.1 id=1022:1483 class=0604(PCIBridge) link=7.88GB/s buses=0000:[63-63])
            PCI L#0 (busid=0000:63:00.0 id=14e4:16d6 class=0200(Ethernet) link=7.88GB/s)
            PCI L#1 (busid=0000:63:00.1 id=14e4:16d6 class=0200(Ethernet) link=7.88GB/s)
          PCIBridge L#2 (busid=0000:60:05.2 id=1022:1483 class=0604(PCIBridge) link=0.50GB/s buses=0000:[61-62])
            PCIBridge L#3 (busid=0000:61:00.0 id=1556:be00 class=0604(PCIBridge) link=0.50GB/s buses=0000:[62-62])
              PCI L#2 (busid=0000:62:00.0 id=102b:0536 class=0300(VGA))
        NUMANode L#0 (P#2 local=65175752KB total=65175752KB)
        NUMANode L#1 (P#3 local=66057292KB total=66057292KB)
        NUMANode L#2 (P#4 local=66058316KB total=66058316KB)
        NUMANode L#3 (P#5 local=66045004KB total=66045004KB)
          PCIBridge L#5 (busid=0000:00:01.1 id=1022:1483 class=0604(PCIBridge) link=15.75GB/s buses=0000:[01-01])
            PCI L#3 (busid=0000:01:00.0 id=1000:10e2 class=0104(RAID) link=15.75GB/s PCISlot=0-1)
          PCIBridge L#6 (busid=0000:00:01.2 id=1022:1483 class=0604(PCIBridge) link=1.00GB/s buses=0000:[02-02])
            PCI L#4 (busid=0000:02:00.0 id=1b4b:9230 class=0106(SATA) link=1.00GB/s PCISlot=0-2)
              Block(Disk) L#2 (Size=234431064 SectorSize=512 LinuxDeviceID=8:16 Model=MTFDDAV240TDU Revision=J004 SerialNumber=2151338FC1AF) "sdb"
              Block(Disk) L#3 (Size=234431064 SectorSize=512 LinuxDeviceID=8:0 Model=MTFDDAV240TDU Revision=J004 SerialNumber=2151338FC427) "sda"
          PCIBridge L#8 (busid=0000:e0:05.1 id=1022:1483 class=0604(PCIBridge) link=0.50GB/s buses=0000:[e1-e1])
            PCI L#5 (busid=0000:e1:00.0 id=14e4:165f class=0200(Ethernet) link=0.50GB/s)
            PCI L#6 (busid=0000:e1:00.1 id=14e4:165f class=0200(Ethernet) link=0.50GB/s)
        NUMANode L#4 (P#10 local=66058316KB total=66058316KB)
          PCIBridge L#10 (busid=0000:c0:01.1 id=1022:1483 class=0604(PCIBridge) link=15.75GB/s buses=0000:[c1-c1])
            PCI L#7 (busid=0000:c1:00.0 id=1000:10e2 class=0104(RAID) link=15.75GB/s PCISlot=0-4)
              Block(Disk) L#6 (Size=1875374424 SectorSize=512 LinuxDeviceID=8:48 Vendor=NVMe Model=Dell_Ent_NVMe_v2 Revision=.2.0 SerialNumber=36435330529024130025384100000002) "sdd"
              Block(Disk) L#7 (Size=6250037248 SectorSize=512 LinuxDeviceID=8:64 Vendor=DELL Model=PERC_H755N_Front Revision=5.16 SerialNumber=6f4ee080160bd5002ab7652100a1691a) "sde"
              Block(Disk) L#8 (Size=1875374424 SectorSize=512 LinuxDeviceID=8:32 Vendor=NVMe Model=Dell_Ent_NVMe_v2 Revision=.2.0 SerialNumber=36435330529024120025384100000002) "sdc"
          PCIBridge L#11 (busid=0000:c0:08.3 id=1022:1484 class=0604(PCIBridge) link=31.51GB/s buses=0000:[c4-c4])
            PCI L#8 (busid=0000:c4:00.0 id=1022:7901 class=0106(SATA) link=31.51GB/s)
        NUMANode L#5 (P#11 local=66057292KB total=66057292KB)
        NUMANode L#6 (P#12 local=66058316KB total=66058316KB)
        NUMANode L#7 (P#13 local=66040920KB total=66040920KB)
          PCIBridge L#13 (busid=0000:80:01.2 id=1022:1483 class=0604(PCIBridge) link=2.00GB/s buses=0000:[81-81])
            PCI L#9 (busid=0000:81:00.0 id=10de:1bb1 class=0300(VGA) link=2.00GB/s PCISlot=4)
Special depth -3:   8 NUMANode (type #13)
Special depth -5:   10 PCIDev (type #15)
Special depth -6:   9 OSDev (type #16)

您还可以使用lstopo --of png > r7525.png

r7525

强制性法律免责声明:我在戴尔工作。

相关内容