Вход:  Пароль:  
FreeSource: Stati?/OOMKiller ...
Free Source | Каталог | Изменения | НовыеКомментарии | Пользователи | Регистрация |

Как работает 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 требуется только для уменьшения.


http://permalink.gmane.org/gmane.linux.altlinux.community/83158


Ссылок на эту страницу нет


 
Файлов нет. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]