[Comm] oom-killer preferences? :)

Sergey Vlasov =?iso-8859-1?q?vsu_=CE=C1_altlinux=2Eru?=
Вт Мар 18 14:34:54 MSK 2008


On Mon, Mar 17, 2008 at 11:10:59PM +0300, Pavlov Konstantin wrote:
> Ну как сказать, у меня на ноутбуке за ночь кушает все полтора гига и
> система практически умирает, причем oom-killer почему-то отстреливает все
> подряд, а не kopete.
> 
> Может, есть какие-нибудь методы сказать oom-killer'у убивать в первую
> очередь определенные приложения?

OOM killer выбирает среди всех процессов, кроме init, процесс с наибольшим
значением badness, которое считается следующим образом:

 1. Берётся размер виртуальной памяти процесса в страницах (total_vm).

 2. К этому размеру прибавляется total_vm/2 + 1 для всех порождённых
    процессов, имеющих собственный VM (т.е., полноценных процессов, а не
    потоков, использующих тот же VM).  Таким образом, если процесс
    порождает большое количество дочерних процессов, которые в сумме
    потребляют много памяти, он с большой вероятностью будет выбран для
    OOM kill, однако благодаря делению на 2, если на самом деле активным
    потребителем памяти является только один из дочерних процессов,
    вероятнее всего, будет выбран только этот процесс.

 3. Полученное значение делится на int_sqrt(cpu_time), где cpu_time -
    процессорное время (user+system), использованное к этому моменту,
    приблизительно в 10-секундных единицах (на самом деле там вместо
    деления используется сдвиг, так что, например, при HZ=1000 получится
    8.192 с); если int_sqrt(cpu_time) == 0, значение не изменяется.

 4. Полученное значение делится на int_sqrt(int_sqrt(run_time/1024)), где
    run_time - реальное время, прошедшее с момента запуска процесса, в
    секундах; если int_sqrt(int_sqrt(run_time/1024)) == 0, значение не
    изменяется.

 5. Если для процесса было установлено значение nice > 0, значение badness
    умножается на 2 (предполагается, что такие процессы менее важны, чем
    обычные).

 6. Если процесс имеет привилегию CAP_SYS_ADMIN, либо uid == 0, либо euid
    == 0, значение badness делится на 4 (процессы root считаются более
    важными, чем прочие).

 7. Если процесс имеет привилегию CAP_SYS_RAWIO, значение badness делится
    на 4 (принудительное завершение процесса, осуществлявшего прямой
    доступ к устройствам, может привести к нежелательным последствиям,
    поэтому такие процессы получают дополнительную защиту).

 8. Наконец, используется значение, установленное в /proc/$PID/oom_adj:
    если oom_adj находится в диапазоне от -16 до 15, значение badness
    умножается на 2^{oom_adj} (т.е., положительные значения увеличивают
    badness, отрицательные - уменьшают).  Значение -17 безусловно
    запрещает OOM killer выбирать этот процесс.

Текущее значение badness для процесса можно найти в /proc/$PID/oom_score
(уже с учётом установленного для этого процесса oom_adj).

В ядрах <= 2.6.19 запись в /proc/$PID/oom_adj, несмотря на видимые права
доступа 0644, можно выполнять только при наличии CAP_SYS_RESOURCE; начиная
с 2.6.20, пользователь имеет право увеличить значение oom_adj для своих
процессов (это значение наследуется порождёнными процессами), а привилегия
CAP_SYS_RESOURCE требуется только для уменьшения.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: Digital signature
Url     : <http://lists.altlinux.org/pipermail/community/attachments/20080318/52d7b4f1/attachment-0002.bin>


Подробная информация о списке рассылки community