web-dev-qa-db-ja.com

どのcgroupがOOMを引き起こしたかを見つける方法は?

Cgroupを使用してプロセスを分割していますが、カーネルログにメモリ不足のメッセージが表示されます。

ただし、どのパーティションが原因であるかがわかりません。メモリコントローラーcgroupを確認しましたが、それを使用する明確な方法はありません。

問題は、システムログに「taskkilled」メッセージが表示されるまでに、タスクが停止し、その/ procエントリがなくなり、cgroupのtasksファイルにkilledタスクのpidがないことです。

4
Cyberax

私自身の質問に答えます。 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 
8
Cyberax