У меня есть Linux-машина без свопа, на которой vm.overcommit_memory=2
и vm.overcommit_ratio=100
устанавливать. Однако эти настройки, похоже, не действуют. Некоторые недавно запущенные процессы, которые пытаются использовать много памяти, все еще уничтожаются OOM вместо того, чтобы им было отказано в выделении памяти. Это потому, что процессы начались раньше sysctl -w vm.overcommit_memory=2 vm.overcommit_ratio=100
(например, до /etc/sysctl.conf
применяется во время загрузки) может по-прежнему иметь доступ к своей чрезмерно загруженной памяти и тем самым запускать OOM-killer? Можно ли (1) отключить избыточное выделение памяти с помощью параметров ядра или (2) во время выполнения заставить ядро выделить всю избыточную память для всех процессов?
РЕДАКТИРОВАТЬ: после просмотра соответствующих Documentation/
и часть исходного кода Linux (git c6fa8e6de3) (1) кажется маловероятным.
Вы пытаетесь сделать то, что просто невозможно. Если вы позволите системе работать почти до полного исчерпания, всегда будет возможность убить процесс из-за нехватки памяти. Существует множество сценариев, которых нельзя избежать, но самый простой для понимания - это ошибка страницы, вызванная процессом, добавляющим страницу в свой стек.
Вам нужен своп или подушка RAM, если вы хотите избежать убийства.