如何解释 numademo 输出
Posted
技术标签:
【中文标题】如何解释 numademo 输出【英文标题】:How to interpret numademo output 【发布时间】:2014-01-21 08:19:25 【问题描述】:numademo 实用程序(是 numactl 包的一部分)随许多流行的 Linux 发行版(RHEL、SLES、...)一起提供。我试图找出与此工具相关的任何文档,但找不到任何有用的信息。要么没有人使用它,要么每个使用它的人都知道它。
这是一个示例输出
2 个节点可用
memory with no policy memcpy Avg 10415.77 MB/s Max 10427.37 MB/s Min 10377.83 MB/s
local memory memcpy Avg 9499.52 MB/s Max 10423.22 MB/s Min 7239.55 MB/s
memory interleaved on all nodes memcpy Avg 7355.64 MB/s Max 7657.19 MB/s Min 6284.92 MB/s
memory on node 0 memcpy Avg 5837.94 MB/s Max 6073.07 MB/s Min 5067.05 MB/s
memory on node 1 memcpy Avg 10285.20 MB/s Max 10425.29 MB/s Min 9206.11 MB/s
memory interleaved on 0 1 memcpy Avg 7513.01 MB/s Max 7658.31 MB/s Min 6440.88 MB/s
setting preferred node to 0
memory without policy memcpy Avg 6071.17 MB/s Max 6073.07 MB/s Min 6069.55 MB/s
setting preferred node to 1
memory without policy memcpy Avg 9126.62 MB/s Max 10427.37 MB/s Min 7236.55 MB/s
manual interleaving to all nodes memcpy Avg 7357.19 MB/s Max 7656.07 MB/s Min 6439.30 MB/s
manual interleaving on node 0/1 memcpy Avg 7512.90 MB/s Max 7658.31 MB/s Min 6439.30 MB/s
current interleave node 1
running on node 0, preferred node 0
local memory memcpy Avg 10086.53 MB/s Max 10423.22 MB/s Min 8943.84 MB/s
memory interleaved on all nodes memcpy Avg 6451.66 MB/s Max 6454.36 MB/s Min 6448.01 MB/s
memory interleaved on node 0/1 memcpy Avg 5199.00 MB/s Max 5200.24 MB/s Min 5196.63 MB/s
alloc on node 1 memcpy Avg 5068.47 MB/s Max 5069.99 MB/s Min 5067.05 MB/s
local allocation memcpy Avg 10248.81 MB/s Max 10421.15 MB/s Min 8933.17 MB/s
setting wrong preferred node memcpy Avg 6070.75 MB/s Max 6072.37 MB/s Min 6067.45 MB/s
setting correct preferred node memcpy Avg 10418.04 MB/s Max 10423.22 MB/s Min 10408.74 MB/s
running on node 1, preferred node 0
local memory memcpy Avg 10417.63 MB/s Max 10423.22 MB/s Min 10400.48 MB/s
memory interleaved on all nodes memcpy Avg 7653.39 MB/s Max 7660.55 MB/s Min 7641.57 MB/s
memory interleaved on node 0/1 memcpy Avg 6949.18 MB/s Max 7658.31 MB/s Min 5201.27 MB/s
alloc on node 0 memcpy Avg 5952.14 MB/s Max 6073.77 MB/s Min 5065.10 MB/s
local allocation memcpy Avg 10419.28 MB/s Max 10425.29 MB/s Min 10402.54 MB/s
setting wrong preferred node memcpy Avg 6069.06 MB/s Max 6073.07 MB/s Min 6059.03 MB/s
setting correct preferred node memcpy Avg 10248.81 MB/s Max 10423.22 MB/s Min 8946.89 MB/s
我需要知道 这些测试是如何进行的?
如何解释这些结果?
例如:什么会导致以下数字出现巨大差异。
memory on node 0 memcpy Avg 5837.94 MB/s
memory on node 1 memcpy Avg 10285.20 MB/s
谢谢, 哈莎娜
【问题讨论】:
【参考方案1】:测试是不言自明的。它使用libnuma
中的函数在不同的NUMA 节点上分配内存并测量对其进行操作所需的时间。例如,您的程序似乎最初是在第二个 NUMA 域的 CPU 内核上运行的,因此访问节点 0 上的内存几乎要慢两倍。对交错内存的访问速度通常是两个域的访问速度的平均值,因为页面是以循环方式分布的。
setting preferred node to 0
表示程序告诉操作系统优先分配节点 0 上的内存。以下测试确认此策略有效,因为速度仍然很慢(因为程序仍在节点 1 上运行)。
setting preferred node to 1
告诉操作系统最好在节点 1 上分配内存。因此速度会更高,因为这是执行程序的本地内存。
running on node 0, preferred node 0
- 程序将自身移动到节点 0(libnuma 也支持 CPU 绑定和内存绑定)并将内存分配器设置为也首选节点 0。因此首选内存位置现在对于正在执行的程序来说是本地的,并且因此速度很高。
等等。只需查看该实用程序的源代码即可。
结果不是很对称,原因很复杂。请注意,NUMA 在 Linux 上的实现很糟糕,至少在 2.6.x 内核中(3.x 中可能有所改进)。例如,内存分配器倾向于合并连续的虚拟分配,然后不再遵守内存绑定策略,例如绑定到节点 0 的 VM 区域有时会映射到节点 1 中的页面。此外,如果内存被换出到磁盘,则无论何时将其带回,NUMA 策略都会被完全忽略,例如绑定到 NUMA 节点 0 的内存可能最终在节点 1 上。
【讨论】:
感谢 Hristo 的解释。我能够在linux.die.net/man/3/numa 上找到有用的信息如果我们从 Bios 启用内存交错,应用程序可以使用 libnuma 调用覆盖它吗?操作系统是否知道 BIOS 设置? 如果您在 BIOS 中启用该选项,它可能会重新编程内存控制器以执行物理内存空间交错(而不是拥有两个巨大的连续块)。操作系统应该能够通过 ACPI BIOS 表检测到这一点。支持 NUMA 的内核可能会重新配置内存控制器,但我对此表示怀疑。相反,它可能会将内存视为统一的。【参考方案2】:
numademo
是 numactl 包提供的二进制文件。它提供了系统 NUMA 性能的快速概览。
numademo
命令显示不同内存分配策略对系统的影响。
$ numademo --help
usage: numademo [-S] [-f] [-c] [-e] [-t] msize[kmg] tests
No tests means run all.
-c output CSV data. -f run even without NUMA API. -S run stupid tests. -e exit on error
-t regression test; do not run all node combinations
valid tests: memset memcpy forward backward stream random2 ptrchase
有效测试详情可查看:https://github.com/jmesmon/numactl/blob/master/numademo.c
【讨论】:
以上是关于如何解释 numademo 输出的主要内容,如果未能解决你的问题,请参考以下文章
scikit-learn RandomForestClassifier - 如何解释树输出?