Memory 如何从shell计算给定(Linux)系统上的内存带宽?

Memory 如何从shell计算给定(Linux)系统上的内存带宽?,memory,sysfs,memory-bandwidth,Memory,Sysfs,Memory Bandwidth,我想编写一个shell脚本/命令,它使用常用的二进制文件、/sys文件系统或其他工具来计算给定机器上可用RAM的理论最大带宽 注: 我不关心延迟,只关心带宽 我对缓存的效果(例如CPU的最后一级缓存)不感兴趣,而是对从RAM读取的带宽感兴趣 如果有帮助的话,你可以假设一个“普通”的英特尔平台,所有内存DIMM都是相同的;但我希望你不要做出这样的假设 如果有帮助,您可以依赖root权限(例如使用sudo) @einpoklum您应该看看性能计数器监视器,该监视器位于。它将为您提供所需的测量值。我

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

注:

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

@einpoklum您应该看看性能计数器监视器,该监视器位于。它将为您提供所需的测量值。我不知道它是否支持内核2.6.32


或者,您还应该查看英特尔的EMON工具,该工具承诺最早支持内核2.6.32。《用户指南》在中列出,这意味着它可以在英特尔软件论坛的某个地方下载。

我不知道有任何独立的工具可以做到这一点,但仅限英特尔芯片,如果您知道芯片的“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模型,并遵循链接

这为您提供了最大理论带宽,可以计算为
(内存通道数)x(传输宽度)x(数据速率)
数据速率
是单位时间内的传输次数,通常是以内存类型名称给出的数字,例如,
DDR-2133
的数据速率为每秒21.33亿次传输。或者,您可以将其计算为总线速度(本例中为1067 MHz)和数据速率乘数(DDR技术为2)的乘积

对于我的CPU,此计算得出
2个内存通道*8字节/传输*21330万次传输/秒=34.128 GB/s
,与ARK图一致

请注意,ARK报告的理论最大值可能低于或高于特定系统的理论最大值,原因包括:

  • 填充的内存通道数少于最大通道数。例如,如果我在双通道系统中只填充一个通道,理论带宽将减少一半
  • 未使用支持的最大速度RAM。我的CPU支持多种不同速度的RAM类型(DDR4-2133、LPDDR3-1866、DDR3L-1600)。ARK图假设您使用尽可能快的受支持RAM,这在我的情况下是正确的,但在其他系统上可能不正确
  • 相对于标称速度,内存总线的时钟频率过高或过低
一旦你得到了正确的理论数字,你在实践中就不会真正达到这个数字,这是由于以下各种因素造成的:

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

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

您对哪种带宽感兴趣?CPU内存?I/O RAM?RAM是指虚拟内存还是直接访问物理内存?那么L3(或最后一个)缓存呢?你看了吗?@diginoise:我问的是RAM,不是CPU缓存。我的意思是,你可以从RAM读到系统上的任何地方;通常情况下,这是您可以从不同的内存库读取到系统上不同CPU插槽的数据量。您是否希望使用
time-dd if=/dev/zero of=/dev/null-bs=1g count=200
或其他方法进行基准测试?如果不是,那么
[benchmarking]
标签就没有意义。你说你想要的是“理论”最大带宽,这意味着不是基准,而是读取DRAM参数和总线速度,然后简单地乘以结果带宽(可能是根据CPU型号查找内存通道的数量)。如果您确实想要一个基准,这是一个事实上的标准。各种基准测试包都提供了自己的内存带宽测试。TinyMemBench是另一个。@BeeOnRope:我明白你的意思。我正在删除
[benchmarking]
标签。虽然我很欣赏这个链接,但我想要的答案是使用大多数系统上已经可用的二进制文件,而不是我需要下载和构建的东西(在某些情况下,我没有di能力)。