我相信这一点适当的这个问题的答案是肯定的。它与编程无关,否则我可能会在 Stackoverflow 上提问。不过,问题来了。我正在对网络吞吐量进行一些基准测试。我有两个 40GbE NIC 目前直接连接以验证带宽。(为了实现这一点,我使用iperf3)。
我的测试系统是双 Xeon E5 2667(来自 /proc/cpuinfo model name : Intel(R) Xeon(R) CPU E5-2667 0 @ 2.90GHz
),公开了 24 个逻辑处理器。有一个NUMA 超立方体两个节点各连接一半处理器。有 32 GB 的非 ECC DDR3 RAM。在每种情况下,40GbE NIC 都连接到与 NUMA 节点 0 关联的 PCIe Gen 3 x8 插槽。
当我使用 iperf3 执行带有最少选项的测试时(基本上使用默认值,这足以满足我的目的),我无法看到 TCP 测试的带宽超过 21.x Gbps(好吧,偶尔会超过 21,但通常是 21.x)。但是,如果我使用-A n
限制iperf3
到处理器的iperf3 选项<n>
,我会看到 ~36 Gbps,这更符合我的预期。我想了解原因。
我尝试了一些方法numactl
来绑定内存分配、处理器节点和物理处理器。奇怪的是,我无法使用 实现与使用选项iperf3
相同的吞吐量。摆弄各种东西/选项(见numactl
iperf3
-A
numactl 手册页更多信息),主要是,--physcpubind=<n>
在这个测试中我无法达到超过~31Gbps。我想知道为什么。--cpunodebind=<n>
--membind=<n>
为此,我开始使用perf
Linux 提供的软件包。但是,在 Linux 或 Intel 提供的大量文档中,我找不到太多有关 PMU 的信息。哦,它解释了如何运行它,但很少提到事物的真正意义。例如,bus-cycles
出现在“硬件事件”和“内核 PMU 事件”中。有什么区别? perf list
描述了可以监视的“事件”;它很长。我从英特尔找到的有关 Xeon E5 2667(我相信是 Haswell 设置)的文档显示支持各种与 NUMA 相关的东西,并perf list
显示uncore_imc_0/cas_count_read/
和uncore_qpi_0/drs_data/
(以及许多其他)应该与此相关的东西。然而,当我尝试iperf3
监视它时,我发现它不受支持。例如:
$ perf stat -e uncore_qpi_0/drs_data/ -- iperf3 -c 192.168.0.244 -A 0
.... program output ....
Performance counter stats for 'iperf3 -c 192.168.0.244 -A 0':
<not supported> uncore_qpi_0/drs_data/
但是,文档显示应该是这样的。有没有办法找出我的处理器支持什么,而不用运行程序,结果却发现不支持?有人能对理解差异的重要指标提出建议吗?(标记为 RHEL,因为这是解决方案的目标平台。)