Как я могу использовать oom_score_adj?

24

На 11.04 /proc/[pid]содержит oom_score_adj, но man procописывает старый oom_adj. Я безуспешно гуглил любую информацию о том, как это использовать.

Что мне нужно сделать, так это то, что процессы, запущенные с помощью 'pbs' или 'gridengine', будут убиты, прежде чем что-либо еще будет убито. Как я могу это сделать?

bmargulies
источник
Чтобы это изменение было постоянным для сервисов, управляемых Upstart: Как навсегда настроить корректоры OOM killer для демонов? ,
gertvdijk
Это уже ответ. Это ссылки на это. :)
gertvdijk
Но не на этом сайте :-)
bmargulies

Ответы:

13

На основе моих собственных вопросов и ответов по Unix & Linux по аналогичному вопросу.

Как Стюарт очень хорошо указал в своем ответе , допустимые значения являются целыми числами в диапазоне от -1000 до 1000 для oom_score_adj. Чем ниже значение, тем ниже вероятность того, что его убьют.

Очень неудобно менять это значение снова и снова после перезапуска приложения. Информация просто теряется после завершения процесса. Upstart (демон init в Ubuntu), имеет хорошую опцию для этого, чтобы настроить демонов, чтобы убедиться, что он установлен каждый раз, когда он (повторно) запускается:

oom score

[...] отрезать [...]

Пример:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app

Таким образом, вы можете отредактировать /etc/init/myservice.confфайл конфигурации для сервисов, которые вы хотите изменить, чтобы включить строку oom score -1000. Я предполагаю, что службы pbs или gridengine, о которых вы говорите в своем вопросе, поддерживают Upstart, в противном случае вам понадобится другой способ изменить это навсегда.

gertvdijk
источник
7

Если вы можете изменить стартовый скрипт, порождая процесс, который вы хотите расставить по приоритетам для oom-killer, добавьте следующее в стартовый скрипт:

echo 1000 > /proc/self/oom_score_adj

Значение наследуется для дочерних процессов.

user1338062
источник
6

Если вы установите высокое значение (ish) для oom_adj или oom_score_adj, то они будут убиты первыми. например

echo 15 > /proc/[pid]/oom_adj

oom_adj идет от -16 до 15 и, как упоминалось выше, oom_score_adj принимает от -1000 до 1000

Стюарт
источник
Вы должны быть пользователем root, чтобы сделать это. sudo sh -c "echo -1000 > /proc/[PID]/oom_score_adj"
Адил
2
На самом деле, вы можете увеличить оценку ваших процессов без root («да, это может быть убито»). Для уменьшения (ниже 0) нужен рут.
Писквор
5

Изучение кода всегда хорошая идея. Обычно я использую функцию поиска в kernel.org, но сейчас она отключена. Github тоже хорошо справляется. Я нашел это:

Вместо этого добавляется новый параметр / proc / pid / oom_score_adj, который варьируется от -1000 до +1000. Он может использоваться для поляризации эвристики, так что некоторые задачи никогда не рассматриваются для убийства, в то время как другие всегда могут рассматриваться. Это значение добавляется непосредственно в оценку badness (), поэтому, например, значение -500 означает скидку 50% потребления памяти по сравнению с другими задачами в системе, связанной с mempolicy, в процессоре или разделяя тот же контроллер памяти.

С https://github.com/mirrors/linux-2.6/commit/a63d83f427fbce97a6cea0db2e64b0eb8435cd10#include/linux/oom.h

Фальстаф
источник
Спасибо за указатель, но я надеюсь, что кто-нибудь подъедет к нему и примет рецепт для всей проблемы, которая, кажется, устраивает установку этого значения для демона exec pbs до того, как он разветвляется.
bmargulies