记录主要页面错误的日志内存访问

pol*_*lol 5 linux memory systemtap page-fault perf

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

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

我认为perf或systemtap可以完成这项工作.有任何想法吗?

fch*_*che 6

查看探测点可用的内容:

% 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
Run Code Online (Sandbox Code Playgroud)

记录,尝试将地址映射到符号名称

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

另见:http://sourceware.org/systemtap/examples/#memory/pfaults.stp


pap*_*rin 6

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

我建议您阅读本教程以学习使用该工具.

要安装只是使用:

您正在寻找事件页面错误.您可以通过以下方式安装(在ubuntu或其他apt发行版中):

sudo apt-get install linux-tools-common linux-base 
sudo apt-get install linux-tools-YOUR-KERNEL number
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令获取内核编号:uname -r

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

perf record -e page-faults:u -F 250 ls
Run Code Online (Sandbox Code Playgroud)

然后你可以看看结果("ls"的二进制文件没有调试信息,因此不要指望漂亮的输出):

perf report
Run Code Online (Sandbox Code Playgroud)