У меня довольно старая машина Linux с 2 ГБ оперативной памяти, без подкачки, и она работает очень хорошо, система использует каждый неиспользуемый фрагмент памяти для кеширования с большим эффектом.
Однако, когда я близок к нагрузке на память (например, выделено> 1950 МБ), она замедляется до ползания; Я подозреваю, что это потому, что не осталось дисковых буферов. Я знаю, что OOM Killer скоро вступит в силу, но обычно этого не происходит - он становится настолько медленным, что загружает до 30-40, ни один процесс не делает никакого прогресса (таким образом, не выделяет больше памяти), и Я должен перезапустить его.
Когда я пытаюсь просто убить один процесс, чтобы заставить машину реагировать, например, перейдя в консоль (через Alt-F1, войдя в систему и просто выполнив killall badprocess), он обычно работает, за исключением того, что мне приходится ждать ~ 10 минут между пользователем и паролем и получением приглашения - все, пока есть активность на диске.
Опять же, нет никакого обмена, так что это не обмен - он просто работает, потому что у него не осталось буферов.
У меня было бы около 100 МБ или около того, выделенных исключительно для дисковых буферов, которые раньше вызывали бы OOM killer (в конце концов, меньше памяти для программ), но, с другой стороны, машина всегда была бы отзывчивой.
Есть способ сделать это? Мне не удалось найти запись в / proc / kernel или / sys / vm, которая делает подобные вещи.
Ответы:
Посмотрите на / proc / sys / vm / min_free_kbytes . Это предел свободного килобайта, который запускает убийцу бомб. Также было бы неплохо проверить в логах ключевое слово oom-killer, чтобы узнать, что именно убивается {вероятно, вы не хотите убивать ssh , вам лучше взять его в аренду }
источник
Ожидание того, чтобы о-убийца освободил память, похоже на ожидание остановки двигателя на вашем автомобиле, чтобы сообщить вам, когда пора заполнить бензобак. Ужасный убийца - это мощный инструмент последней инстанции и отчаяние для истощенной ресурсами машины. Он убивает следующую касающуюся программу, не обращая внимания на то, как это повлияет на ваше приложение, достижимость, надежность и так далее. При вызове oom-killer ваш сервер задыхается и находится в критическом состоянии.
Вместо этого вам гораздо лучше использовать активный подход к управлению использованием памяти в среде вашего приложения. Вы можете отслеживать проблемы в / proc / meminfo, предпринимать соответствующие действия и снижать нагрузку до того, как серьезная ситуация станет уродливой.
источник
oom_adj
правильно, вы можете заставить свою настольную систему работать немного как Android, где система практически всегда работает против OOM killer (технически есть «убийца низкой памяти», и она настраивается через/sys/module/lowmemorykiller
). Логика заключается в том, чтобы постоянно отмечать некритические фоновые процессы как потенциальные жертвы убийцы OOM и искать уничтоженные процессы и медленно перезапускать требуемые уничтоженные программы, чтобы избежать перегрузки системы. Просто убедитесь, что процесс, который продолжает перезапускать другие процессы, выделен за пределы OOM killer.