Насколько я понимаю, когда система близка к отсутствию свободной памяти, ядро должно начать уничтожать процессы, чтобы восстановить часть памяти. Но в моей системе этого не происходит вообще.
Предположим, что простой скрипт просто выделяет гораздо больше памяти, чем доступно в системе (например, массив с миллионами строк). Если я запускаю такой скрипт (как обычный пользователь), он просто получает всю память, пока система полностью не зависнет (работает только SysRQ REISUB).
Странная часть здесь в том, что когда компьютер зависает, индикатор жесткого диска включается и остается таким до перезагрузки компьютера, либо если у меня установлен раздел подкачки, либо нет!
Итак, мои вопросы являются:
ОЗУ: ~ 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
Из официальной /proc/sys/vm/*
документации :
oom_kill_allocating_task
Это включает или отключает уничтожение задачи запуска OOM в ситуациях нехватки памяти .
Если это значение равно нулю, убийца OOM просканирует весь список задач и выберет задачу на основе эвристики для уничтожения. Обычно это выбирает мошенническую задачу, занимающуюся переполнением памяти, которая освобождает большой объем памяти при уничтожении.
Если для этого параметра установлено ненулевое значение, убийца OOM просто завершает задачу, которая вызвала состояние нехватки памяти. Это позволяет избежать дорогостоящего сканирования списка задач.
Если выбран panic_on_oom, он имеет приоритет над тем значением, которое используется в oom_kill_allocating_task.
Значением по умолчанию является 0.
Чтобы подвести итог, при установке oom_kill_allocating_task
в 1
вместо сканирования вашей системы в поисках процессов для уничтожения, что является дорогой и медленной задачей, ядро просто уничтожит процесс, вызвавший система, чтобы выйти из памяти.
Из моего собственного опыта, когда запускается OOM, у ядра больше не остается «силы», достаточной для такого сканирования, что делает систему полностью непригодной для использования.
Кроме того, было бы более очевидно просто убить задачу, вызвавшую проблему, поэтому я не понимаю, почему для нее установлено значение 0
по умолчанию.
Для тестирования вы можете просто записать соответствующий псевдофайл в /proc/sys/vm/
, который будет отменен при следующей перезагрузке:
echo 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task
Для постоянного исправления напишите следующее в /etc/sysctl.conf
или в новый файл в разделе /etc/sysctl.d/
с расширением .conf
(например, /etc/sysctl.d/local.conf
):
vm.oom_kill_allocating_task = 1
Обновление: ошибка исправлена.
Ответа Терезы достаточно, чтобы обойти проблему, и он хороший.
Кроме того, я подал отчет об ошибке , потому что это определенно нарушенное поведение.
close
эти numfmt
команда: gnu.org/software/gawk/manual/html_node/…
– muru
22 June 2015 в 01:24
Прежде всего, я рекомендую обновить до 13.10 (чистая установка, сохранить ваши данные).
Если вы не хотите обновлять, измените vm.swappiness на 10, и если вы обнаружите проблемы с вашей оперативной памятью, установите zRAM.
Можно попробовать earlyoom, уничтожитель OOM, который работает в пространстве пользователя и пытается уничтожить самый большой процесс в ситуации OOM.