如何测量Linux中两个NUMA节点之间进程使用了多少QPI/UPI带宽?
假设我的进程在NUMA节点0上有一个线程,在NUMA节点1上有另一个线程,每个线程在另一个NUMA节点上访问它们的数据,从而限制了QPI/UPI带宽。如何测量带宽使用情况?
我有一台使用UPI技术的2倍英特尔skylake处理器的机器,但我认为解决方案也适用于QPI(不确定!)。
您想测量两个非统一内存访问(NUMA)节点(又名'远程内存访问'或'NUMA访问')之间内存访问产生的流量(带宽)。当一个处理器需要访问存储在由另一个处理器管理的内存中的数据时,使用点对点处理器互连,如英特尔超路径互连(UPI)。
收集特定进程/线程的UPI(或QPI)带宽可能会很棘手。
每个UPI链路带宽(CPU socket粒度)
Processor Counter Monitor (PCM)提供了许多用于实时监控的命令行实用程序。例如,pcm二进制文件显示每个套接字的UPI流量估计。根据所需的精度(以及其他进程生成的NUMA流量),了解UPI链路是否饱和可能就足够了。
英特尔内存延迟检查器(MLC)可以用作工作负载,以检查PCM在两个NUMA节点之间创建最大流量时的行为。
例如,使用./mlc --bandwidth_matrix -t15
生成的工作负载(在远程访问阶段),PCM使用我的2套接字(Intel Cascade Lake)服务器节点显示以下内容:
Intel(r) UPI data traffic estimation in bytes (data traffic coming to CPU/socket through UPI links):
UPI0 UPI1 UPI2 | UPI0 UPI1 UPI2
---------------------------------------------------------------------------------------------------------------
SKT 0 17 G 17 G 0 | 73% 73% 0%
SKT 1 6978 K 7184 K 0 | 0% 0% 0%
---------------------------------------------------------------------------------------------------------------
Total UPI incoming data traffic: 34 G UPI data traffic/Memory controller traffic: 0.96
Intel(r) UPI traffic estimation in bytes (data and non-data traffic outgoing from CPU/socket through UPI links):
UPI0 UPI1 UPI2 | UPI0 UPI1 UPI2
---------------------------------------------------------------------------------------------------------------
SKT 0 8475 M 8471 M 0 | 35% 35% 0%
SKT 1 21 G 21 G 0 | 91% 91% 0%
---------------------------------------------------------------------------------------------------------------
Total UPI outgoing data and non-data traffic: 59 G
MEM (GB)->| READ | WRITE | LOCAL | PMM RD | PMM WR | CPU energy | DIMM energy | LLCRDMISSLAT (ns) UncFREQ (Ghz)
---------------------------------------------------------------------------------------------------------------
SKT 0 0.19 0.05 92 % 0.00 0.00 87.58 13.28 582.98 2.38
SKT 1 36.16 0.01 0 % 0.00 0.00 66.82 21.86 9698.13 2.40
---------------------------------------------------------------------------------------------------------------
* 36.35 0.06 0 % 0.00 0.00 154.40 35.14 585.67 2.39
监控NUMA流量(CPU核心粒度)
PCM还以MB/s为单位显示每核远程流量(即NUMA流量)。见人民币栏:
RMB:远端内存满足的L3缓存外部带宽(inmb)
Core (SKT) | EXEC | IPC | FREQ | AFREQ | L3MISS | L2MISS | L3HIT | L2HIT | L3MPI | L2MPI | L3OCC | LMB | RMB | TEMP
0 0 0.04 0.04 1.00 1.00 1720 K 1787 K 0.04 0.55 0.0167 0.0173 800 1 777 49
1 0 0.04 0.04 1.00 1.00 1750 K 1816 K 0.04 0.55 0.0171 0.0177 640 5 776 50
2 0 0.04 0.04 1.00 1.00 1739 K 1828 K 0.05 0.55 0.0169 0.0178 720 0 777 50
3 0 0.04 0.04 1.00 1.00 1721 K 1800 K 0.04 0.55 0.0168 0.0175 240 0 784 51
<snip>
---------------------------------------------------------------------------------------------------------------
SKT 0 0.04 0.04 1.00 1.00 68 M 71 M 0.04 0.55 0.0168 0.0175 26800 8 31632 48
SKT 1 0.02 0.88 0.03 1.00 66 K 1106 K 0.94 0.13 0.0000 0.0005 25920 4 15 52
---------------------------------------------------------------------------------------------------------------
TOTAL * 0.03 0.06 0.51 1.00 68 M 72 M 0.05 0.54 0.0107 0.0113 N/A N/A N/A N/A
每核远程流量可用于收集线程级NUMA流量。
估算线程间产生的NUMA吞吐量的方法
需要确保生成NUMA流量的线程绑定到专用内核。这可以通过编程方式完成,也可以使用hwloc-bind等工具重新绑定线程。
确保其他进程绑定到不同的cpu核心(像cpusanitizer这样的脚本可能有助于定期扫描所有进程并修改它们的cpu核心亲和力)。注意:注意超线程。您不希望需要监视的线程与其他进程共享相同的CPU内核。
检查在您要监视的线程所附加的核心上生成的远程流量(PCM RMB列)。