Linux 记录内存访问占用

Linux 记录内存访问占用,linux,memory,qemu,perf,mmu,Linux,Memory,Qemu,Perf,Mmu,我是克莱门茨博士发现的。虽然它很有用,但在我需要的情况下它不能正常工作。我打算使用该记录来理解不同场景中的内存访问模式 有人能分享一下相关的经验吗?如有任何建议,将不胜感激 0313已更新: 我正在尝试使用qemu mtrace来启动带有linux mtrace(3.8.0)的ubuntu 16.04, 但它只显示几个错误消息并终止。希望有一些工具能够记录每次访问 $ ./qemu-system-x86_64 -mtrace-enable -mtrace-file mtrace.out -hda

我是克莱门茨博士发现的。虽然它很有用,但在我需要的情况下它不能正常工作。我打算使用该记录来理解不同场景中的内存访问模式

有人能分享一下相关的经验吗?如有任何建议,将不胜感激

0313已更新: 我正在尝试使用qemu mtrace来启动带有linux mtrace(3.8.0)的ubuntu 16.04, 但它只显示几个错误消息并终止。希望有一些工具能够记录每次访问

$ ./qemu-system-x86_64 -mtrace-enable -mtrace-file mtrace.out -hda ubuntu.img -m 1024
Error: mtrace_entry_ascope (exit, syscall:xx) with no stack tag!
mtrace_entry_register: mtrace_host_addr failed (10)
mtrace_inst_exec: bad call 140734947607728
Aborted (core dumped)

perf mem
工具可用于一些现代x86/EM64T CPU(可能仅限英特尔;常春藤和更新的桌面/服务器CPU)。
perf mem
的手册页与内核文档目录中的文本相同:。文本不完整;最好的文档是来源:&部分在中。没有详细资料

qemu mtrace
不同,它不会记录每一次内存访问,而只记录每一次N次访问,其中N类似于10000或100000。但它以本机速度和低开销工作。使用
perf mem record./program
记录模式;尝试为某些CPU内核的系统范围或全局采样添加
-a
-C cpulist
。无法记录(跟踪)系统内部的所有和每次内存访问(工具应将信息写入内存并将记录此访问-这是有限内存的无限递归),但有非常昂贵的专有系统特定外部跟踪解决方案,如JTAG或SDRAM嗅探器($5k或更多)

2013年前后添加了
perf mem
工具(3.10版linux内核),在lwn上搜索perf mem有几个结果:

使用此修补程序,可以对内存进行采样(而不是跟踪) 访问(加载、存储)。对于加载,指令和数据 将捕获地址以及延迟和数据源。 对于存储,指令和数据地址被捕获 以及有限的缓存和TLB信息

当前补丁 在从Nehalem开始的英特尔处理器上实现此功能。 这些补丁利用PEBS加载延迟和精确存储 机制。精确存储仅存在于沙桥和 常春藤桥处理器

添加了物理地址采样支持:(
perf mem--phys addr-t load rec
);(还有与位相关的2016年c2cperf工具“追踪缓存线争用”:附示例)

perf mem
上的一些随机幻灯片:

有关解码性能mem-D报告的一些信息:

“ADDR”、“DSRC”、“SYMBOL”是什么意思

(由与本回答相同的用户回答)

  • IP—加载/存储指令的PC
  • SYMBOL—包含本指令的功能名称(IP)
  • ADDR—加载/存储请求的数据的虚拟内存地址(如果没有--phys data选项)
  • DSRC-“解码源”
还可以通过排序来获取一些基本统计信息:
perf mem rep--sort=mem
-


其他工具。。有一个基于valgrind的(慢速)cachegrind模拟器,用于模拟用户空间程序的缓存—“7.2模拟CPU缓存”。还应该为与DRAMsim/DRAMsim2相关的低级(最慢)机型提供一些功能

您的CPU架构是什么,是x86吗?请提供更多关于您的场景的详细信息,并解释为什么qemu mtrace不适合您。您是想记录用户程序的每次内存访问,还是也要记录内核访问?(由于内存不足,无法存储超过秒的日志;您需要5000美元以上的外部专有jtag调试器/dram记录器硬件)。或者您可以只记录所有访问的1/100000来查看模式?在第二种情况下,请检查
perf mem
工具(x86/x64 Intels支持)。感谢您的回复。CPU arch是x86,我想分析整个系统的占用空间,比如播放流视频、浏览互联网等场景,qemu mtrace在ubuntu 16.04中使用内核(linux mtrace)时不能正常工作,只显示错误消息,并在问题更新时终止
perf mem
看起来很有用,但似乎无法在系统范围内进行日志记录?当跟踪程序位于跟踪系统内时,您无法跟踪跟踪程序的所有内存访问。mtrace需要特殊的内核和编译模式。您需要整个日志还是只需要一些统计数据?可以使用
-perf mem
-C cpulist
-a
选项来执行系统范围或每个cpu核心的mem跟踪(仍然可以使用帧指针重新编译所有内容或仅一些用于展开的调试信息),非常感谢您的帮助,我使用
perf mem record-a
实现我想要的效果。正如您所说,perf的日志转储非常大。再次感谢:)
 # PID, TID, IP, ADDR, LOCAL WEIGHT, DSRC, SYMBOL
 2054  2054 0xffffffff811186bf 0x016ffffe8fbffc804b0    49 0x68100842 /lib/modules/3.12.23/build/vmlinux:perf_event_aux_ctx