如何监控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 吞吐量的方法
您需要确保生成 NUMA 流量的线程绑定到专用内核。这可以通过编程方式完成,或者您可以使用 hwloc-bind.
等工具重新绑定线程
确保其他进程绑定到不同的 cpu 核心(像 cpusanitizer 这样的脚本可能有助于定期扫描所有进程并修改它们的 CPU 核心亲和力) .注意:注意超线程。您不希望需要监视的线程与其他进程共享相同的 CPU 内核。
检查在附加了要监视的线程的核心上生成的远程流量(PCM RMB 列)。
如何测量 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 吞吐量的方法
您需要确保生成 NUMA 流量的线程绑定到专用内核。这可以通过编程方式完成,或者您可以使用 hwloc-bind.
等工具重新绑定线程确保其他进程绑定到不同的 cpu 核心(像 cpusanitizer 这样的脚本可能有助于定期扫描所有进程并修改它们的 CPU 核心亲和力) .注意:注意超线程。您不希望需要监视的线程与其他进程共享相同的 CPU 内核。
检查在附加了要监视的线程的核心上生成的远程流量(PCM RMB 列)。