Код возврата, когда OOM killer убивает процесс

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

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

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

У меня есть фреймворк, который запускает все процессы, а затем ждет их с помощью

waitpid(pid, &status, 0);

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

WIFEXITED(status);

возвращает один, и звонок

WEXITSTATUS(status);

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

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

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

Виктор

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

1 ответ

Решение

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

TLPI

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

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

if (WIFSIGNALED(status)) {
    if (WTERMSIG(status) == SIGKILL)
        printf("Killed by SIGKILL\n");
}
Другие вопросы по тегам