如何监控Linux进程的NUMA互连(QPI/UPI)带宽使用?

How to monitor NUMA interconnection (QPI/UPI) bandwidth usage of a process in Linux?

如何测量 Linux 中两个 NUMA 节点之间进程使用的 QPI/UPI 带宽?

假设我的进程在 NUMA 节点 0 上有一个线程,在 NUMA 节点 1 上有另一个线程,每个线程都在限制 QPI/UPI 带宽的另一个 NUMA 节点上访问它们的数据。如何衡量这种带宽使用情况?

我有一台配备 2 个 Intel skylake 处理器的机器,它使用 UPI 技术,但我认为 QPI 的解决方案也是一样的(不确定!)。

您想测量两个 Non-Uniform 内存访问 (NUMA) 节点(也称为 'remote memory accesses' 或 'NUMA accesses')之间的内存访问所产生的流量(带宽)。当处理器需要访问存储在由不同处理器管理的内存中的数据时,会使用 point-to-point 处理器互连,例如 Intel Ultra Path Interconnect (UPI)。

收集特定 process/thread 的 UPI(或 QPI)带宽可能会很棘手。

每个 UPI link 带宽(CPU 套接字粒度)

Processor Counter Monitor (PCM) 为 real-time 监控提供了许多 command-line 实用程序。例如,pcm 二进制文件显示每个套接字 UPI 流量估计。根据所需的精度(以及其他进程生成的 NUMA 流量),了解 UPI link 是否饱和可能就足够了。

英特尔内存延迟检查器 (MLC) 可用作工作负载,以检查在两个 NUMA 节点之间创建最大流量时 PCM 的行为方式。

例如,使用 ./mlc --bandwidth_matrix -t15 生成的工作负载(在远程访问阶段),PCM 在我的 2-socket (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 cache external bandwidth satisfied by remote memory (in MBytes)

 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 吞吐量的方法

  1. 您需要确保生成 NUMA 流量的线程绑定到专用内核。这可以通过编程方式完成,或者您可以使用 hwloc-bind.

    等工具重新绑定线程
  2. 确保其他进程绑定到不同的 cpu 核心(像 cpusanitizer 这样的脚本可能有助于定期扫描所有进程并修改它们的 CPU 核心亲和力) .注意:注意超线程。您不希望需要监视的线程与其他进程共享相同的 CPU 内核。

  3. 检查在附加了要监视的线程的核心上生成的远程流量(PCM RMB 列)。