如何找到导致OOM的cgroup?

Cyb*_*rax 4 linux oom cgroup

我正在使用 cgroup 对我的进程进行分区,并且在我的内核日志中收到 Out Of Memory 消息。

但是,我找不到导致它们的分区。我检查了内存控制器 cgroup,但没有明显的使用方法。

问题是,当我在系统日志中看到“任务被杀死”消息时,任务已经死亡,它的 /proc 条目消失了,cgroup 的任务文件没有被杀死任务的 pid。

Cyb*_*rax 8

回答我自己的问题。我已经使用 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)
}
Run Code Online (Sandbox Code Playgroud)

像这样工作:

Cyber​​ax@cybnb:~/work/shell$ sudo stap -g oom.stap
pid 3966 mem-cgroup /task1/1/ exe-name oom_generator.p