我正在使用cgroup来分割我的进程,并在内核日志中收到内存不足的消息。
但是,我无法find哪个分区导致他们。 我已经检查了内存控制器cgroup,但没有明显的方法来使用它。
问题是,当我在系统日志中看到“任务被终止”消息时,任务已经死了,它的/ proc项不见了,cgroup的任务文件没有被kill 任务的pid。
回答我自己的问题。 我已经使用SystemTap钩入OOM杀手:
#!/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