![如何找到导致 OOM 的 cgroup?](https://linux22.com/image/582183/%E5%A6%82%E4%BD%95%E6%89%BE%E5%88%B0%E5%AF%BC%E8%87%B4%20OOM%20%E7%9A%84%20cgroup%EF%BC%9F.png)
我正在使用 cgroup 来划分我的进程,并且在我的内核日志中收到了内存不足消息。
但是,我找不到导致这些问题的分区。我检查了内存控制器 cgroup,但没有明显的使用方法。
问题是,当我在系统日志中看到“任务终止”消息时,该任务已经终止,其 /proc 条目已消失,并且 cgroup 的任务文件没有被终止的任务的 pid。
答案1
回答我自己的问题。我使用 SystemTap 来挂载 OOM killer:
#!/usr/bin/env stap
%{
#include <linux/cgroup.h>
%}
function find_mem_cgroup:string(task:long) %{
struct cgroup *cgrp;
struct task_struct *tsk = (struct task_struct *)((long)THIS->task);
/* Initialize with an empty value */
strcpy(THIS->__retvalue, "NULL");
cgroup_lock();
cgrp = task_cgroup(tsk, mem_cgroup_subsys_id);
if (cgrp)
cgroup_path(cgrp, THIS->__retvalue, MAXSTRINGLEN);
cgroup_unlock();
%}
probe kernel.function("oom_kill_task") {
cgroup = find_mem_cgroup($p)
exename = kernel_string($p->comm)
printf("pid\t%d\tmem-cgroup\t%s\texe-name\t%s\n", $p->pid, cgroup, exename)
}
工作原理如下:
cyberax@cybnb:~/work/shell$ sudo stap -g oom.stap pid 3966 mem-cgroup /task1/1/ exe-name oom_generator.p