Насколько я понимаю, когда система близка к отсутствию свободной памяти, ядро должно начать уничтожать процессы, чтобы восстановить часть памяти. Но в моей системе этого не происходит вообще.
Предположим, что простой скрипт просто выделяет гораздо больше памяти, чем доступно в системе (например, массив с миллионами строк). Если я запускаю такой скрипт (как обычный пользователь), он просто получает всю память, пока система полностью не зависнет (работает только SysRQ REISUB).
Странная часть здесь в том, что когда компьютер зависает, светодиод жесткого диска включается и остается таким до перезагрузки компьютера, либо если у меня установлен раздел подкачки, либо нет!
Итак, мои вопросы:
- Это нормальное поведение? Странно, что приложение, выполненное как обычный пользователь, может просто так сбить систему ...
- Есть ли способ заставить Ubuntu просто автоматически убивать эти приложения, когда они получают слишком много (или больше) памяти?
Дополнительная информация
- Ubuntu 12.04.3
- Ядро 3.5.0-44
Оперативная память: ~ 3,7 ГБ из 4 ГБ (используется совместно с графической картой). *
$ tail -n+1 /proc/sys/vm/overcommit_* ==> /proc/sys/vm/overcommit_memory <== 0 ==> /proc/sys/vm/overcommit_ratio <== 50 $ cat /proc/swaps Filename Type Size Used Priority /dev/dm-1 partition 4194300 344696 -1
tail -n+1 /proc/sys/vm/overcommit_*
добавить вывод. Смотрите здесь также: Как мне настроить oom-killerAllocation failed
). Но без свопа просто зависает компьютер. Он должен работать таким образом (убивать только при использовании свопа)?Ответы:
Из официальной
/proc/sys/vm/*
документации :Для того , чтобы подвести итоги, при установке
oom_kill_allocating_task
в1
, вместо сканирования системы в поисках процессов , чтобы убить, что является дорогой и медленной задачей, ядро будет просто убить процесс, вызвавшую систему , чтобы выйти из памяти.Исходя из моего собственного опыта, когда запускается OOM, ядру больше не хватает «силы» для такого сканирования, что делает систему полностью непригодной для использования.
Кроме того, было бы более очевидно просто убить задачу, вызвавшую проблему, поэтому я не понимаю, почему она установлена
0
по умолчанию.Для тестирования вы можете просто написать соответствующий псевдофайл в файле
/proc/sys/vm/
, который будет отменен при следующей перезагрузке:Для постоянного исправления напишите следующее в
/etc/sysctl.conf
или в новый файл/etc/sysctl.d/
с.conf
расширением (/etc/sysctl.d/local.conf
например):источник
0
по умолчанию». - потому что процесс, который запрашивал память, не обязательно тот, который «вызвал проблему». Если процесс A забирает 99% системной памяти, но процесс B, который использует 0,9%, оказывается тем, который запускает убийцу OOM по несчастью, B не «вызывает проблему», и нет смысла kill B. Имея это в качестве политики, вы рискуете полностью беспроблемными процессами с нехваткой памяти случайно быть убитыми из-за использования неконтролируемой памяти другим процессом.vm.admin_reserve_kbytes
увеличивается, скажем, до 128 МБ .vm.oom_kill_allocating_task = 1
Кажется, установка облегчает проблему, но не решает ее (а Ubuntu по умолчанию уже работает с вилочными бомбами).sudo sysctl -w vm.oom_kill_allocating_task=1
Обновление: ошибка исправлена.
Ответа Терезы достаточно, чтобы обойти проблему, и он хороший.
Кроме того, я подал отчет об ошибке, потому что это определенно нарушенное поведение.
источник
Вы можете попробовать Earlyoom , убийцу OOM, который работает в пространстве пользователя и пытается уничтожить самый большой процесс в ситуации OOM.
источник
Прежде всего, я рекомендую обновить до 13.10 (чистая установка, сохранить ваши данные).
Если вы не хотите обновлять, измените vm.swappiness на 10, и если вы обнаружите проблемы с вашей оперативной памятью, установите zRAM.
источник
vm.swappiness
приносит больше вреда, чем пользы, даже больше в системах, страдающих от недостатка памяти.