记录内存访问足迹

2024-03-22

I found mtrace https://github.com/aclements/mtrace克莱门茨博士。虽然很有用,但是在我需要的情况下却不能正常工作。我打算使用该记录来了解不同场景下的内存访问模式。

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

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实施的工具some现代 x86/EM64T CPU(可能仅支持 Intel;Ivy 和更新的桌面/服务器 cpu)。的手册页perf mem is http://man7.org/linux/man-pages/man1/perf-mem.1.html http://man7.org/linux/man-pages/man1/perf-mem.1.html和内核文档目录中的相同文本:http://lxr.free-electrons.com/source/tools/perf/Documentation/perf-mem.txt http://lxr.free-electrons.com/source/tools/perf/Documentation/perf-mem.txt。文字不完整;最好的文档是来源:工具/perf/builtin-mem.c http://lxr.free-electrons.com/source/tools/perf/builtin-mem.c&部分在工具/perf/builtin-report.c http://lxr.free-electrons.com/source/tools/perf/builtin-mem.c?v=4.10#L264。没有详细信息https://perf.wiki.kernel.org/index.php/Tutorial https://perf.wiki.kernel.org/index.php/Tutorial.

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

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

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

目前的补丁 在从 Nehalem 开始的 Intel 处理器上实现该功能。 这些补丁利用 PEBS 加载延迟和精确存储 机制。 Precise Store 仅存在于 Sandy Bridge 和 基于 Ivy Bridge 的处理器。

添加了物理地址采样支持:https://lwn.net/Articles/555890/ https://lwn.net/Articles/555890/ (perf mem --phys-addr -t load rec); (还有一点相关的2016年c2c性能工具“跟踪缓存行争用": https://lwn.net/Articles/704125/ https://lwn.net/Articles/704125/举例说明https://joemario.github.io/blog/2016/09/01/c2c-blog/ https://joemario.github.io/blog/2016/09/01/c2c-blog/)

一些随机幻灯片perf mem:

  • http://indico.cern.ch/event/280897/contributions/1628882/attachments/515361/711133/SE-CERN_PMU_workshop_2013.pdf#page=4 http://indico.cern.ch/event/280897/contributions/1628882/attachments/515361/711133/SE-CERN_PMU_workshop_2013.pdf#page=4
  • http://www.linuxtag.org/2013/fileadmin/www.linuxtag.org/slides/Arnaldo_Melo__-_Linux__perf__tools__O​​verview_and_Current_Developments.e323.pdf#page=10 http://www.linuxtag.org/2013/fileadmin/www.linuxtag.org/slides/Arnaldo_Melo_-_Linux__perf__tools__Overview_and_Current_Developments.e323.pdf#page=10
  • https://people.netfilter.org/pablo/netdev0.1/slides/sowa-perf-analytics.pdf#page=19 https://people.netfilter.org/pablo/netdev0.1/slides/sowa-perf-analytics.pdf#page=19

有关解码的一些信息perf mem -D report: perf mem -D 报告 https://stackoverflow.com/questions/33295288

 # 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

“地址”、“DSRC”、“符号”是什么意思?

(与此答案相同的用户回答)

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

还可以通过排序来获取一些基本统计数据:perf mem rep --sort=mem - http://thread.gmane.org/gmane.linux.kernel.perf.user/1438 http://thread.gmane.org/gmane.linux.kernel.perf.user/1438

其他工具..有(慢)cachegrindemulator基于 valgrind 来模拟用户空间程序的高速缓存 - 《7.2 模拟 CPU 高速缓存》https://lwn.net/Articles/257209/ https://lwn.net/Articles/257209/。还应该有一些与 DRAMsim/DRAMsim2 相关的低级(最慢)模型http://eng.umd.edu/~blj/dramsim/ http://eng.umd.edu/~blj/dramsim/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记录内存访问足迹 的相关文章

随机推荐

  • 是否可以使用 PropTypes 来验证类似 Dictionary 的对象?

    我需要在我的减速器中验证类似字典的对象 但由于我已经在使用 Babel 所以我不想求助于 Typescript 等工具 以此对象为例 posts byId post1 id post1 author user1 body comments
  • url 的最大重试次数超出(无法建立新连接:[Errno 110] 连接超时)

    raise ConnectionError e request request requests exceptions ConnectionError HTTPSConnectionPool host mycompanyurl in por
  • 在 Powershell 上获取行号?

    所以我一直在寻找 但找不到任何不会给我带来任何回报的东西 我有一个带有变量的代码 并且有一个包含很多行的文件 例如 我有以下文件 things txt Ketchup Mustard Pumpkin Mustard Ketchup 而我要取
  • 复选框绑定 CHANGE 事件

    我想在用户单击 触摸复选框后提交表单 THE HTML
  • 如何在c中通过指针传递二维数组[重复]

    这个问题在这里已经有答案了 可能的重复 将表示二维数组的指针传递给 C 中的函数 https stackoverflow com questions 5329107 passing a pointer representing a 2d a
  • LLVM 6.0.0 的构建大小很大 (42G)

    I built llvm 6 0 0从源头开始 一切正常 我只是想知道它的尺寸怎么这么大 42G 我可以轻松删除一些目标文件或其他文件以使构建目录更小吗 du hs GIT llvm 6 0 0 build 42G home oren GI
  • 当 Bash 脚本编写和捕获输出时,在后台使用与号 (&) 分叉命令

    我希望在后台分叉一个进程 同时捕获 bash 脚本中的输出 我可以运行以下脚本来 ping IP 列表 它将每个调用移至后台并且运行速度非常快 但它不会捕获执行命令的输出以供进一步处理 for i in cat list txt do pi
  • 如何在 Visual C++ 2008 中创建 UTF-8 字符串文字

    在 VC 2003 中 我可以将源文件保存为 UTF 8 并按原样使用所有字符串 换句话说 以下代码将按原样将字符串打印到控制台 如果源文件保存为 UTF 8 则输出将为 UTF 8 printf Chinese Traditional p
  • Intel Fortran 错误 #6633:实际参数的类型与虚拟参数的类型不同

    对于可能在这里提出这样一个基本问题 我深表歉意 我是使用英特尔 Fortran 编程的新手 所以我认为在这种情况下 我不知道有一些东西丢失或组织错误 如果有人能在这方面帮助我 我将不胜感激 问题是我在编译代码时看到以下错误 而我相信我已经声
  • 如何在 Android 上创建渐进式 JPEG 图像

    我需要通过very来自 Android 手机的低带宽连接 低至 10kByte s 并希望以渐进 隔行 模式发送它们 以便另一端的用户在漫长的传输过程中开始看到图像 现在 我正在使用常规照片应用程序创建图像 Intent takePictu
  • 突变观察者 - DOM 通过回调函数改变

    有没有办法 如何强制突变观察者忽略回调函数引起的 DOM 变化 现在我有 var config attributes true childList true characterData true var target document bo
  • 如何在 Visual Studio 中获得 .feature 文件的 Gherkin 语法突出显示?

    默认情况下 Feature Scenario Given When Then 等关键字不会突出显示 是否有现成的模板可以实现此目的 最新版本SpecFlow http www specflow orgVS2010有一个内置的语法高亮
  • 通过绘图下拉菜单切换显示的迹线

    我正在使用 R 编程语言 我试图在这里复制本教程以获取我自己的数据 https plotly com r dropdowns https plotly com r dropdowns 我创建了一些假数据并绘制了 4 个图 load libr
  • Rails.env 与 RAILS_ENV

    在检查运行环境时 我在示例中看到了这两种情况 首选什么 就所有意图和目的而言 它们是否平等 根据文档 http api rubyonrails org classes Rails html method c env Rails env wr
  • 如何修复 BBcode 正则表达式

    我有一个获取 BBcode 标签的正则表达式 除了一个小故障之外 它工作得很好 这是当前的表达式 x22 x22 1 以下是它成功匹配的一些文本及其构建的组 url http www google com 去 http www google
  • 将可选属性表示为 C++ 类成员

    我正在根据模式生成 C 代码 存在实体 每个实体包含属性 每个属性具有相应的数据类型 现在的问题是其中一些属性是 可选的 这意味着它们不必是类声明的一部分 然而 在C 中 某些东西要么是类的成员 要么不是类的成员 没有诸如 可选数据成员 之
  • Android 子模块中的数据绑定

    我有一个应用程序模块 让我们说 测试 测试 模块依赖于子模块 B 两者都启用数据绑定 在库模块 B 中 我使用数据绑定创建一个简单的活动 其目的是为了可重用性 例如 我可以创建一个基本登录屏幕并稍后在许多应用程序中使用它 下面是B包中的示例
  • Microsoft Visual Studio 和 C#:如何以可视方式向控件添加事件?

    如何使用 C 将事件处理程序添加到 Microsoft Visual Studio 2008 窗体中的控件 我可以手动执行此操作 但打开表单的 Designer cs 文件 但我找不到通过界面执行此操作的方法 在 MSVC 6 中 使用 C
  • 如何使用 Mysql Joins 而不是嵌套子查询来获得相同的结果?

    我有一些嵌套子查询 结果非常慢 我正在努力用 Mysql Joins 重写相同的代码 我希望有人可以帮助我 我想从数据库中除播放列表中的歌曲之外的所有歌曲中获取数据 之后我只想要播放列表中的歌曲 在这里你可以看到我的查询 提前致谢 Quer
  • 记录内存访问足迹

    I found mtrace https github com aclements mtrace克莱门茨博士 虽然很有用 但是在我需要的情况下却不能正常工作 我打算使用该记录来了解不同场景下的内存访问模式 有人可以分享相关经验吗 任何建议将