遇到一个需求,需要在内核中统计mysql进程匿名页的访问热度。
配置系统环境
将透明大页关闭:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
寻找mysql的task_struct
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | struct task_struct *task = NULL;
 
 int findMysql(void)
 {
 int ret = 0;
 struct task_struct *proc;
 for_each_process(proc){
 if(!strcmp(proc->comm, "mysqld")){
 task = proc;
 ret = 1;
 break;
 }
 }
 return ret;
 }
 
 | 
统计匿名页热度
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | int tem;struct page *page = NULL;
 struct page_cgroup *pc;
 struct vm_area_struct *vma;
 unsigned long addr = 0;
 
 for(vma = task->mm->mmap; vma != NULL; vma = vma->vm_next){
 for(addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE){
 page = follow_page(vma, addr, 0);
 if (page && PageAnon(page)){
 pc = lookup_page_cgroup(page);
 tem = page_referenced(page, 0, pc, &vm_flags) ? 1 : 0;
 sprintf(str_buf, "22222222:%ul:%d\n", page_to_pfn(page), tem);
 write_to_file((void *)str_buf, strlen(str_buf));
 }
 }
 }
 
 |