Код возврата, когда 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");
}