33

Я пытаюсь настроить свою систему разработки на максимальную надежность. Я отключил подкачку, потому что для использования графического интерфейса это в основном делает машину безразличной таким образом, что больше не может использоваться. Тем не менее, если агрессивные приложения съедают память, некоторые механизмы, похоже, используют это, чтобы максимально эффективно использовать затраты на скорость. Операции подкачки жесткого диска не существует, но система также перестает отвечать на запросы. Поэтому я хочу позволить убийце OOM включиться до того, как система предпримет какие-то особые усилия по увеличению памяти. Можно ли настроить убийцу OOM для работы, если, например, свободной физической памяти менее 100 МБ?

5 ответов5

34

Я также боролся с этой проблемой. Я просто хочу, чтобы моя система оставалась отзывчивой, несмотря ни на что, и я предпочитаю потерять процессы, а не ждать несколько минут. Кажется, нет никакого способа добиться этого, используя ядро Oom Killer.

Однако в пространстве пользователя мы можем делать все, что захотим. Поэтому я написал ранний демон OOM ( https://github.com/rfjakob/earlyoom ), который уничтожит самый большой процесс (по RSS), когда доступная оперативная память опустится ниже 10%.

Без раннего увеличения было легко заблокировать мою машину (8 ГБ ОЗУ), запустив http://www.unrealengine.com/html5/ несколько раз. Теперь вкладки виновных в браузере убиваются до того, как вещи выходят из-под контроля.

11

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

Вы можете изменить политику по умолчанию, чтобы запретить переполнение памяти, записав значение 2 в /proc/sys/vm/overcommit_memory . Значение по умолчанию /proc/sys/vm/overcommit_ratio равно 50, поэтому ядро не позволит приложениям выделять более 50% ram+swap. Если у вас нет свопа, то ядро не позволит приложениям выделять более 50% оперативной памяти, оставляя остальные 50% свободными для кеша. Это может быть немного чрезмерно, поэтому вы можете увеличить это значение, скажем, до 85% или около того, чтобы приложения могли выделять до 85% оперативной памяти, оставляя 15% для кэша.

7

Для меня установка vm.admin_reserve_kbytes = 262144 делает именно это. Убийца OOM вмешивается до того, как система перестает отвечать на запросы.

2

Другие ответы имеют хорошие автоматические решения, но я считаю, что может быть полезно также включить ключ SysRq когда ситуация выходит из-под контроля. С помощью ключа SysRq вы будете вручную отправлять сообщения ядру и можете делать такие вещи, как безопасная перезагрузка (с SysRQ + REISUB), даже если пользовательское пространство полностью зависло .

Чтобы разрешить ядру прослушивать запросы, установите kernel.sysrq = 1 или включите только те функции, которые вы, вероятно, будете использовать с битовой маской (документировано здесь). Например, kernel.sysrq = 244 включит все комбинации, необходимые для безопасной перезагрузки выше, а также ручной вызов убийцы OOM с помощью SysRq + F

-2

Надежность не достигается из-за нехватки памяти и убийцы OOM.

Неправильно организовывать вечеринку в шкафу и помещать "вычищать мой шкаф" в свой маленький плейлист.

Можно ли заставить убийцу ООМ вмешаться раньше?

Это может привести к непредвиденным побочным эффектам, потому что вы не можете контролировать то, что убито.

Я пытаюсь настроить свою систему разработки на максимальную надежность.

Максимальная надежность предполагает тестирование вашей системы и ее улучшение на основе этих тестов.

Простая настройка случайных вещей никуда не приведет ...

Я отключил подкачку, потому что для использования графического интерфейса это в основном делает машину безразличной таким образом, что больше не может использоваться. Тем не менее, если агрессивные приложения съедают память, некоторые механизмы, похоже, используют это, чтобы максимально эффективно использовать затраты на скорость.

Из-за нехватки памяти отключение подкачки не улучшит поведение, а наоборот.

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

Операции подкачки жесткого диска не существует, но система также перестает отвечать на запросы.

Недостаток памяти действительно приводит к отсутствию ответа независимо от того, есть ли у вас своп или нет.

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

Особые усилия, которые принесут больше вреда, чем пользы, как я объяснил выше. Вместо этого вы можете убивать процессы, которые вам не нужны, но я думаю, вы не сможете этого сделать, поэтому OOM будет убивать процессы, которые вам нужны.

Можно ли настроить убийцу OOM для работы, если, например, свободной физической памяти менее 100 МБ?

Возможно, но вы получите более высокую отдачу от инвестиций, если просто купите дополнительную память, которая на самом деле не стоит больших денег в наши дни. Учтите, что в долгосрочной перспективе вы можете ударить себя по ноге, если продолжите работать в условиях нехватки памяти. OOM похож на судебного пристава, он не помогает вам, он помогает ОС ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .