Я выполняю многопрограммную рабочую нагрузку (на основе тестов 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 задавая почти тот же вопрос.Однако, поскольку это старый пост и ответы на него не были удовлетворительными, я решил опубликовать новый вопрос.