我有两台物理数据库服务器(均为 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 测试的完整答案很长而且很微妙。以下是一些需要考虑的一般事项:
- 这并非不可能,但在现代的 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
- 您可以使用 检查 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
- 如果你确实有 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
强制性法律免责声明:我在戴尔工作。