logging内存访问会导致严重的页面错误

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

关于我想要实现的一些背景。 我有一个大的内存占用(数据库)的应用程序,我想分页与访问大数据结构(如表,使用mmap()分配的索引)相关联。 该过程的映射很容易从/ proc //地图中检索。 现在,如果我有导致页面错误的内存访问,我可以跟踪访问每个数据结构时导致多less页面错误。

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

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

% 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

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

我建议你阅读本教程来学习使用该工具。

要安装只使用:

您正在寻找事件页面错误 。 您可以通过以下方式安装(在Ubuntu或其他apt分配):

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

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

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

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

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

 perf report