Код возврата, когда OOM killer убивает процесс - PullRequest
6 голосов
/ 24 августа 2011

Я выполняю многопрограммную рабочую нагрузку (на основе тестов SPEC CPU2006) в системе POWER7 с использованием SUSE SLES 11.

Иногда каждое приложение в рабочей нагрузке потребляет значительный объем памяти, и общий объем занимаемой памяти превышаетдоступная память, установленная в системе (32 ГБ).

Я отключил своп, так как в противном случае измерения могли бы сильно пострадать для процессов, использующих своп.Я знаю, что, делая это, ядро ​​через OOM killer может убить некоторые процессы.Это совершенно нормально.Проблема состоит в том, что я ожидал бы, что поток, убитый ядром, вышел с условием ошибки (например, процесс был прерван сигналом).

У меня есть структура, которая запускает все процессы и затем ждетиспользуя

waitpid(pid, &status, 0);

Даже если убийца OOM уничтожил поток (я знаю, что, поскольку я получаю сообщение на экране и в / var / log / messages), вызов

WIFEXITED(status);

возвращает единицу, а вызов

WEXITSTATUS(status);

возвращает ноль.Поэтому я не могу различить, когда процесс завершается правильно и когда он убит убийцей OOM.

Я что-то не так делаю?Знаете ли вы какой-нибудь способ определить, когда процесс был убит убийцей OOM.

Большое спасибо,

Виктор

PS: я нашел этоpost задавая почти тот же вопрос.Однако, поскольку это старый пост и ответы на него не были удовлетворительными, я решил опубликовать новый вопрос.

1 Ответ

7 голосов
/ 24 августа 2011

Linux OOM killer работает, отправляя SIGKILL. Если ваш процесс убит OOM, то подозрительно, что WIFEXITED возвращает 1.

TLPI

Чтобы убить выбранный процесс, убийца OOM доставляет SIGKILL сигнал.

Таким образом, вы сможете проверить это, используя:

if (WIFSIGNALED(status)) {
    if (WTERMSIG(status) == SIGKILL)
        printf("Killed by SIGKILL\n");
}
...