我想编写一个 shell 脚本/命令,它使用常用的二进制文件、文件/sys
系统或其他工具来计算给定机器上可用 RAM 的理论最大带宽。
笔记:
- 我不关心延迟,只关心带宽。
- 我对缓存的影响(例如 CPU 的最后一级缓存)不感兴趣,但对从 RAM 正确读取的带宽感兴趣。
- 如果有帮助,您可以假设一个“普通”英特尔平台,并且所有内存 DIMM 都是相同的;但我宁愿你不要做这个假设。
- 如果有帮助,您可以依赖 root 权限(例如使用
sudo
)
我想编写一个 shell 脚本/命令,它使用常用的二进制文件、文件/sys
系统或其他工具来计算给定机器上可用 RAM 的理论最大带宽。
笔记:
sudo
)@einpoklum 你应该看看https://github.com/opcm/pcm上提供的性能计数器监视器。它将为您提供所需的测量值。不知道是否支持内核2.6.32
或者,您还应该检查 Intel 的 EMON 工具,该工具承诺支持早至 2.6.32 的内核。用户指南列在https://software.intel.com/en-us/download/emon-user-guide,这意味着它可以在英特尔软件论坛的某个地方下载。
我不知道有任何独立工具可以做到这一点,但仅适用于英特尔芯片,如果您知道芯片的“ARK URL”,则可以使用查询 ARK 的工具组合获得最大带宽,例如curl
,和解析返回的 HTML 的东西,比如xmllint --html --xpath
.
例如,对于我的 i7-6700HQ,以下工作:
curl -s 'https://ark.intel.com/products/88967/Intel-Core-i7-6700HQ-Processor-6M-Cache-up-to-3_50-GHz' | \
xmllint --html --xpath '//li[@class="MaxMemoryBandwidth"]/span[@class="value"]/span/text()' - 2>/dev/null
这将返回34.1 GB/s
这是我的芯片的最大理论带宽。
主要困难是确定 ARK URL,它与 CPU 品牌字符串没有明显的对应关系。一种解决方案是在这样的索引页面上找到 CPU 型号,然后点击链接。
这为您提供了最大理论带宽,可以计算为(number of memory channels) x (trasfer width) x (data rate)
。是每单位时间的data rate
传输次数,通常是内存类型名称中给出的数字,例如,DDR-2133
数据速率为每秒 21.33 亿次传输。或者,您可以将其计算为总线速度(在本例中为 1067 MHz)和数据速率乘数(DDR 技术为 2)的乘积。
对于我的 CPU,这个计算2 memory channels * 8 bytes/transfer * 2133 million transfers/second = 34.128 GB/s
结果与 ARK 数字一致。
请注意,由于各种原因,ARK 报告的理论最大值可能低于或高于特定系统的理论最大值,包括:
一旦你得到了正确的理论数字,你实际上不会在实践中达到这个数字,原因包括以下各种因素:
尽管如此,使用足够多的内核和非临时存储,您通常可以非常接近理论带宽,通常为 90% 或更多。