我在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)
答案 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.c。 https://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/