【问题标题】:Log memory accesses that cause major page faults记录导致主要页面错误的内存访问
【发布时间】:2013-03-25 17:39:32
【问题描述】:

有谁知道如何获取导致页面错误的内存访问(指针)?我主要对主要的页面错误感兴趣。

关于我想要实现的目标的一些背景知识。我有一个内存占用很大的应用程序(数据库),我想将分页与对大型数据结构(例如使用 mmap() 分配的表、索引)的访问相关联。进程的映射很容易从 /proc//maps 中检索。现在,如果我有导致页面错误的内存访问,我可以跟踪访问每个数据结构时导致了多少页面错误。

我认为 perf 或 systemtap 可以完成这项工作。有什么想法吗?

【问题讨论】:

    标签: linux memory page-fault perf systemtap


    【解决方案1】:

    看看探测点有什么可用的:

    % stap -L vm.pagefault
    vm.pagefault name:string write_access:long address:long $mm:struct mm_struct* \
       $vma:struct vm_area_struct* $address:long unsigned int $flags:unsigned int
    

    日志,尝试将地址映射到符号名称

    # stap -e 'probe vm.pagefault { if (execname()=="foo") { printf("%p (%s)\n", address, usymdata(address)) } }' -d /bin/foo --ldd
    

    另请参阅:http://sourceware.org/systemtap/examples/#memory/pfaults.stp

    【讨论】:

      【解决方案2】:

      你的猜测是正确的。您可以使用 perf 工具来跟踪您的应用程序导致的页面错误的数量。

      我建议您阅读this tutorial 以学习使用该工具。

      安装只需使用:

      您正在寻找事件 page-fault。您可以通过以下方式安装(在 ubuntu 或其他 apt 发行版中):

      sudo apt-get install linux-tools-common linux-base 
      sudo apt-get install linux-tools-YOUR-KERNEL number
      

      您可以通过以下方式获取内核编号: unname -r

      例如,此命令在“ls”命令上运行 perf 工具:

      perf record -e page-faults:u -F 250 ls
      

      然后你可以查看结果(“ls”的二进制文件没有调试信息,所以不要指望一个漂亮的输出):

      perf report
      

      【讨论】:

        猜你喜欢
        • 2011-02-25
        • 1970-01-01
        • 2011-09-17
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多