【问题标题】:How do I calculate memory bandwidth on a given (Linux) system, from the shell?如何从 shell 计算给定(Linux)系统上的内存带宽?
【发布时间】:2018-12-28 20:28:45
【问题描述】:

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

注意事项:

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

【问题讨论】:

  • 您对哪个带宽感兴趣? CPU 内存? I/O 内存? RAM 是指虚拟内存还是直接访问物理内存? L3(或最后一个)缓存呢?你看过superuser.com/questions/827207/…吗?
  • @diginoise:我问的是 RAM,而不是 CPU 缓存。我的意思是您可以从 RAM 读取到系统上的任何位置;通常这将是您可以从不同内存库读取到系统上各种 CPU 插槽的数量。
  • 您是否想要基准测试,例如time dd if=/dev/zero of=/dev/null bs=1g count=200 之类的?如果没有,[benchmarking] 标签就没有意义。
  • 您说您想要“理论”最大带宽,这意味着不是基准,而是读取 DRAM 参数和总线速度并简单地乘以得到的带宽(可能是查找内存通道的数量)基于 CPU 型号)。如果您确实想要一个基准,STREAM 是一个事实上的标准。各种基准测试包提供自己的内存带宽测试。 TinyMemBench 是另一个。
  • @BeeOnRope:我明白你的意思。我正在删除[benchmarking] 标签。

标签: memory sysfs memory-bandwidth


【解决方案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 品牌字符串没有明显的对应关系。一种解决方案是在index page like this one 上找到 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)。 ARK 图假设您使用支持的最快 RAM,这在我的情况下是正确的,但在其他系统上可能并非如此。
  • 内存总线超频或超频,相对于标称速度。

一旦你得到了正确的理论数字,你实际上并不会在实践中达到这个数字,原因如下:

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

不过,使用足够多的内核和非临时存储,您通常可以非常接近理论带宽,通常是 90% 或更多。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 虽然我很欣赏这个链接,但我正在寻求一个使用大多数系统上已经可用的二进制文件的答案,而不是我需要下载和构建的东西(在某些情况下我没有能力 di )。
    猜你喜欢
    • 2018-08-28
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多