1

我想编写一个 shell 脚本/命令,它使用常用的二进制文件、文件/sys系统或其他工具来计算给定机器上可用 RAM 的理论最大带宽。

笔记:

  • 我不关心延迟,只关心带宽
  • 我对缓存的影响(例如 CPU 的最后一级缓存)不感兴趣,但对从 RAM 正确读取的带宽感兴趣。
  • 如果有帮助,您可以假设一个“普通”英特尔平台,并且所有内存 DIMM 都是相同的;但我宁愿你不要做这个假设。
  • 如果有帮助,您可以依赖 root 权限(例如使用sudo
4

2 回答 2

1

@einpoklum 你应该看看https://github.com/opcm/pcm上提供的性能计数器监视器。它将为您提供所需的测量值。不知道是否支持内核2.6.32

或者,您还应该检查 Intel 的 EMON 工具,该工具承诺支持早至 2.6.32 的内核。用户指南列在https://software.intel.com/en-us/download/emon-user-guide,这意味着它可以在英特尔软件论坛的某个地方下载。

于 2018-10-26T16:27:58.050 回答
1

我不知道有任何独立工具可以做到这一点,但仅适用于英特尔芯片,如果您知道芯片的“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 报告的理论最​​大值可能低于或高于特定系统的理论最大值,包括:

  • 填充的内存通道少于最大通道数。例如,如果我在双通道系统上只填充一个通道,理论带宽将减半。
  • 未使用支持的最大速度 RAM。我的 CPU 支持多种速度不同的 RAM 类型(DDR4-2133、LPDDR3-1866、DDR3L-1600)。方舟图假设您使用可能支持的最快 RAM,这在我的情况下是正确的,但在其他系统上可能并非如此。
  • 相对于标称速度,内存总线的超频或欠频。

一旦你得到了正确的理论数字,你实际上不会在实践中达到这个数字,原因包括以下各种因素:

  • 由于未完成请求的并发性有限,无法使一个或多个内核的内存接口饱和,如本答案中的“延迟绑定平台”部分所述。
  • 在写入之前需要读取该行的写入所隐含的带宽加倍。
  • 与 DRAM 接口相关的各种低级因素会阻止 100% 的利用率,例如打开页面的成本、读/写周转时间、刷新周期等。

尽管如此,使用足够多的内核和非临时存储,您通常可以非常接近理论带宽,通常为 90% 或更多。

于 2018-11-03T19:33:14.873 回答