Я использую cgroup для разделения своих процессов и получаю сообщения Out Of Memory в журналах ядра.
Однако я не могу найти, какой раздел их вызывает. Я проверил контрольную группу контроллера памяти, но очевидных способов ее использования нет.
Проблема в том, что к тому времени, когда я вижу сообщение о том, что задача убита в системных журналах, задача мертва, ее запись / proc пропала, а cgroup задачи файл не имеет 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