使用任何纯软件解决方案都无法正确测量内存总线利用率。 (它曾经是,早在 80 年代左右。但后来我们得到了流水线、缓存、乱序执行、多核、具有多条总线的非统一内存架构等)。
您绝对必须让硬件监控内存总线,以确定它有多“忙”。
幸运的是,大多数 PC 平台都有一些,因此您只需要驱动程序和其他软件即可与之对话:
wenjianhn 在https://github.com/opcm/pcm 发现有一个专门针对英特尔硬件(他们称之为处理器计数器监视器)的项目
对于 Windows 上的其他架构,我不确定。但是有一个项目(针对 linux)在https://github.com/RRZE-HPC/likwid
处提供了对不同架构的支持。
原则上,计算机工程师可以将合适的示波器连接到几乎任何 PC 并“直接”进行监控,尽管这可能需要经过适当培训的计算机工程师以及相当高性能的测试仪器(阅读:两者都非常昂贵)。
如果您自己尝试此操作,请知道您可能需要了解您打算监控使用的总线协议的仪器或至少分析。
这有时真的很容易,使用一些总线 - 例如旧的并行 FIFO 硬件,通常有一条单独的线用于“fifo full”和另一条用于“fifo empty”。
此类芯片通常用于单向链路上较快的总线和较慢的总线之间。 'fifo full' 信号,即使它通常偶尔触发,也可以被监控为过长的电平:对于 USB 2.0 高速链路的示例,当操作系统没有轮询 USB fifo 硬件时会发生这种情况时间。通过测量这些“阻塞”的频率和持续时间,您可以测量总线利用率,但仅限于此 USB 2.0 总线。
对于 PC 内存总线,我想您也可以尝试监控您的 RAM 接口正在使用多少电量 - 这可能会随着使用而扩展。这可能很难做到,但你可能会“走运”。您需要为总线提供 VccIO 的电源电流。对于较新的 PC 硬件,这实际上应该比那些古老的 80 年代系统(在开启时总是以全功率运行)更好。
对于这些示例中的任何一个来说,一个相当普通的示波器就足够了 - 您只需要一个只能在“超过给定宽度的脉冲”上触发的示波器,并让它一直运行直到它触发,这是一个很好的“浸泡”方法长期测试。
您可以通过查找“空闲”时间的变化来监控使用情况。
但现代 PC 内存总线要复杂得多,速度也快得多。
要通过轻敲总线直接执行此操作,您至少需要一个专门设计用于监控您的 PC 的 DDR 总线生成的示波器(和有源探头),以及软件分析选项(通常单独出售)对协议进行足够的解码,以找出其上发生的活动类型,从中您可以确定您想要将哪种活动测量为“空闲”。
您甚至可能需要一个旨在让您也进行这些测量的主板。
这并不像仅仅寻找没有活动的时期那么简单——所有 DRAM 至少需要定期刷新周期,这可能会或可能不会与明显的总线活动一起发生(有些 DRAM 会自动执行,有些需要触发它的特定命令,有些可以继续寻址和传输来自未刷新的银行的数据,有些不能,等等)。
因此,仪器需要能够对数据进行足够深入的分析,以便您了解它的繁忙程度。
您最好、最简单的选择是找到一家拥有可满足您需求的工具的 PC 硬件 (CPU) 供应商,然后购买该硬件以便您可以使用这些工具。
这甚至可能涉及在 VM 中运行您的应用程序,因此您可以从托管它的不同操作系统中的更好工具中受益。
为此,您可能想尝试 Linux KVM(是的,即使对于 Windows - 也有适用于它的 Windows 客户驱动程序),并将您的 VM 固定到特定的 CPU,同时您还配置 linux 以避免将相同 CPU 上的其他作业。