Код возврата, когда убийца OOM уничтожает процесс

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

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

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

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

waitpid(pid, &status, 0);

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

WIFEXITED(status);

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

WEXITSTATUS(status);

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

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

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

Виктор

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

6
задан Community 23 May 2017 в 12:13
поделиться