Como descobrir qual cgroup causou a OOM?

4

Estou usando o cgroup para particionar meus processos e estou obtendo mensagens Out of Memory em meus logs do kernel.

No entanto, não consigo encontrar qual partição os causa. Verifiquei o cgroup do controlador de memória, mas não há maneiras óbvias de usá-lo.

O problema é que, quando vejo a mensagem 'task killed' nos logs do sistema, a tarefa está morta, a entrada / proc acabou e o arquivo tasks do cgroup não tem o pid do tarefa morta.

    
por Cyberax 21.04.2012 / 04:47

1 resposta

7

Respondendo a minha própria pergunta. Eu usei o SystemTap para conectar-se ao killer da 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)
}

Funciona assim:

cyberax@cybnb:~/work/shell$ sudo stap -g oom.stap
pid    3966    mem-cgroup    /task1/1/    exe-name    oom_generator.p
    
por 23.04.2012 / 21:14