После "OOM Killer" есть "Resurrector"? - PullRequest
5 голосов
/ 22 декабря 2009

Я понимаю, что в Linux есть функциональность ядра, называемая "OOM Killer". Когда состояние OOM (Out-Of-Memory) спадает , существует ли такая вещь, как «Process Resurrector»?

Я понимаю, что эту функцию было бы трудно реализовать по разным причинам, но есть ли что-то, что близко к ней?

Редактировать : Пример: «Resurrector» будет иметь гарантированный блок памяти для хранения ограниченного набора информации о процессе (например, командной строки, среды и т. Д.) (т.е. не весь код процесса и данные!). Как только условие OOM очищено, «Resurrector» может пройти по списку и «воскресить» некоторые процессы.

Из того, что я понял до сих пор, похоже, что функциональность не похожа на то, что я прошу.

Ответы [ 2 ]

5 голосов
/ 22 декабря 2009

Нет. Когда OOM Killer убил процесс, он умер. Вы можете перезапустить его (если позволяют ресурсы), и если это что-то, управляемое системой (возможно, через inittab), оно может быть перезапущено таким образом.

Редактировать: В качестве мысленного эксперимента подумайте, что означало бы воскресение процесса. Даже если бы вы могли сохранить все состояние процесса, вы бы этого не хотели, потому что уничтоженный процесс мог быть ПРИЧИНОЙ для состояния нехватки памяти.

Так что лучшее, что вы могли бы, возможно, было бы сохранить это состояние запуска (командная строка и т. Д.). Но это тоже не хорошо, потому что, опять же, это может быть, ПОЧЕМУ система исчерпала память в первую очередь!

Кроме того, если вы воскресили процесс таким образом, невозможно сказать, что может пойти не так. Что, если процесс управляет оборудованием? Что делать, если элементы управления процессом не должны запускаться более одного раза? Что если он был подключен к tty, которого больше нет (потому что sshd был одним из уничтоженных процессов)?

Существует огромное количество контекста вокруг процесса, о котором система не может знать. Единственная разумная вещь - это то, что делает ядро: убей присоску и продолжай.

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

Короче говоря: нет, ты не вернешься от убийцы ООМ. Это убийца, вам просто нужно с этим справиться.

3 голосов
/ 22 декабря 2009

конечно нет. Иначе, где можно хранить убитый процесс, если для его хранения больше нет памяти? : -)

Дело в том, что OOM killer вступает в игру только тогда, когда вся доступная память исчерпана, как ОЗУ, так и память на диске. Если «восстановитель процесса» мог «воскресить» процесс после того, как условие исчезло, он должен был бы сохранить его где-то в момент запуска «убийцы». Но поскольку киллер запускается только тогда, когда нет доступной памяти, это невозможно.

Конечно, вы можете сказать «сохранить на диск», но хорошо, подкачка памяти - это диск. Если вы хотите ограничить потребление памяти вашим процессом, используйте функциональность ulimit и отслеживайте использование памяти вручную с помощью программы ps или /proc. «OOM killer» - это мера паники, которая не должна быть очень приятной для процессов.

Пример того, что вы можете сделать с ulimit (и, возможно, без, но я не могу поэкспериментировать с убийством OOM в моей системе atm)

#!/bin/bash
save_something=$ENV_VARIABLE
( ulimit -Sv 1000000; 
   perl -e 'print "Taking all RAM!!!\n"; while (1) { $a[$i++] = $i; }'
)
echo "killed, resetting"
( ulimit -Sv 1000000;
   export ENV_VARIABLE="$save_something"
   perl -e 'print "Taking all RAM!!!\n"; while (1) { $a[$i++] = $i; }'
)
...