【发布时间】:2017-10-20 05:27:18
【问题描述】:
我一直在寻找一种方法来记录 Linux 中进程/执行的所有内存访问。我知道以前在这里有人就这个话题提出过这样的问题
Logging memory access footprint of whole system in Linux
但我想知道是否有任何非仪器工具可以执行此活动。我不为此目的寻找 QEMU/VALGRIND,因为它会有点慢,我希望开销尽可能少。
为此,我查看了perf mem 和cpu/mem-loads/pp 之类的PEBS 事件,但我发现它们只会收集采样数据,而我实际上想要在没有任何采样的情况下跟踪所有内存访问。
我想知道是否有可能通过使用像 QEMU 这样的工具来收集所有内存访问而不会浪费太多开销。是否有可能只使用 PERF 但没有样本,以便我获得所有内存访问数据?
还有其他我缺少的工具吗?或者任何其他可以为我提供所有内存访问数据的策略?
【问题讨论】:
-
你要记录多长时间的过程?它运行1秒吗?它多久有一次内存访问指令,大约每 3 条指令中的 1 条?因此,您将(假设具有 IPC~1 的 3Ghz CPU)有 1 000 000 000 次内存访问,每次访问大约有 8 个字节的元数据(类型,48-52 位的目标地址) - 这是 8 GB! 您无法在没有开销的情况下记录程序的所有内存访问(没有非常昂贵的 20k USD+ 硬件嗅探器)。您可以使用 PT/perf 对其中的 1/1000 或 1/100000 进行采样;或者您可以使用 valgrind 或 qemu 或其他模拟器以 10x-20x-50x 减速记录所有内容。
-
嗨@osgx,我专门寻找spec2006程序(运行时间最长的程序可能是8分钟-我认为这会非常大)。这意味着我不能拥有任何其他工具。如果我想记录所有内存访问,我需要使用硬件嗅探器吗?除此之外,如果我真的想避免开销,我没有其他选择。
-
嗨@osgx,有什么方法可以使用 perf/pt/pebs 来收集所有内存访问样本而不进行采样?还是我完全遵循不同的策略?
-
为什么要避免任何开销?(对于 10 分钟的程序和 10 倍的开销,您将等待 2 小时,这比在这里等待答案要快。)你有钱吗?购买硬件嗅探器(您需要 JTAG 嗅探器 XDP blog.asset-intertech.com/test_data_out/2016/07/… 来获取对缓存的所有访问,或者需要总线/ddr 嗅探器来获取真正的内存访问)?你能估计一下有多少次访问以及写下来需要多少?为什么要记录每个内存访问?
-
我想知道它是否真的可以在没有任何开销的情况下实现。我们正试图看到这一点。我们想要每次内存访问没有确切的理由,但我们正在尝试测量记录所有内存访问的开销。我们的程序中有很多内存访问事件。 (可能达到数百万)。到目前为止,我们对使用任何硬件嗅探器都不感兴趣。
标签: linux memory processor perf