记录内存访问占用空间

时间:2017-03-12 14:18:19

标签: linux memory qemu perf mmu

我在Dr.Clements找到了mtrace。虽然它很有用,但在我需要的情况下它不能正常工作。我打算使用该记录来了解不同场景中的内存访问模式。

有人可以分享相关经验吗?任何建议将不胜感激。

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

$ ./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)

1 个答案:

答案 0 :(得分:4)

某些现代x86 / EM64T CPU(可能只支持Intel;常春藤和更新的桌面/服务器cpus)实施了perf mem工具。 perf mem的手册页是http://man7.org/linux/man-pages/man1/perf-mem.1.html,内核文档目录中的文本相同:http://lxr.free-electrons.com/source/tools/perf/Documentation/perf-mem.txt。案文不完整;最好的文档来源:tools/perf/builtin-mem.c&部分在tools/perf/builtin-report.chttps://perf.wiki.kernel.org/index.php/Tutorial中没有详细信息。

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

2013年左右添加perf mem的工具(Linux内核的3.10版本),在lwn上搜索perf mem有几个结果:https://lwn.net/Articles/531766/

  

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

     

目前的补丁   从Nehalem开始,在英特尔处理器上实现该功能。   这些补丁利用了PEBS Load Latency和Precise Store   机制。 Precise Store仅存在于Sandy Bridge和   基于Ivy Bridge的处理器。

添加了物理地址抽样支持:https://lwn.net/Articles/555890/perf mem --phys-addr -t load rec); (还有与2016年c2c穿孔工具“追踪缓存线争用”的位相关:https://lwn.net/Articles/704125/示例https://joemario.github.io/blog/2016/09/01/c2c-blog/

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

有关解码perf mem -D report的一些信息:perf mem -D report

 # 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
     

“ADDR”,“DSRC”,“SYMBOL”是什么意思?

(由本回答中的同一用户回答)

  
      
  • IP - 加载/存储指令的PC;
  •   
  • SYMBOL - 包含该指令(IP)的函数名称;
  •   
  • ADDR - 加载/存储请求的数据的虚拟内存地址(如果没有--phys-data选项)
  •   
  • DSRC - “解码源”。
  •   

还有一些排序可以获得一些基本统计信息:perf mem rep --sort=mem - http://thread.gmane.org/gmane.linux.kernel.perf.user/1438

其他工具..基于valgrind的(慢)cachegrind 模拟器用于模拟用户空间程序的高速缓存 - “{模拟CPU缓存”https://lwn.net/Articles/257209/。对于与DRAMsim / DRAMsim2相关的低级(最慢)模型也应该有一些东西http://eng.umd.edu/~blj/dramsim/