
Иногда я работаю с огромными массивами данных, которые хочу сохранить в памяти для обработки. Иногда я неправильно рассчитываю объем памяти, который будет производить моя программа, или отладчик умножает использование памяти на коэффициент, который превышает мою доступную память.
Всякий раз, когда я запускаю процесс, требовательный к памяти, именно этого я и ожидаю от разумной операционной системы: попытаться съесть всю свободную память, затем вежливо попросить некоторые другие несущественные процессы отказаться от части памяти, которая им не нужна, а затем записать ее в файл подкачки.
Вот что Ubuntu делает для меня: съедает всю свободную память, затем просит операционную систему переключить все основные службы (сеанс gnome, терминал, клавиатуру), затем замирает и ждет, пока я вытащу вилку из розетки.
Два вопроса:
- Как операционная система может предположить, что что-то может быть настолько важным, что можно перестать прислушиваться к пользовательскому вводу?
- Как мне заставить Ubuntu никогда не отключать важные службы и всегда реагировать на действия пользователя, даже если какой-то глупый процесс пытается потребить больше ресурсов, чем предоставляет система?
решение1
У меня по-прежнему нет решения этой проблемы, но я могу предложить два обходных пути, которые могут быть интересны другим:
1)ранний
Это служба, которая следит за использованием памяти и завершает процесс, потребляющий больше всего памяти, при достижении определенного порога (см. такжеэтотиэтотвопрос относительно OOM killer в ядре Linux)
Я протестировал его с помощью демонстрационного процесса, который бесконечно запрашивает память небольшими порциями. Вот мое первое впечатление: когда я запускаю вредоносный процесс, он быстро съедает всю мою оперативную память. Затем начинается подкачка, система перестает отвечать. Через несколько секунд система снова подключается. Журнал earlyoom показывает, что он уничтожил процесс, пожирающий память, после того, как использование памяти и подкачки достигло 90%.
Все еще наблюдается раздражающая задержка при начале подкачки, а после завершения процесса некоторые части других процессов обычно остаются в подкачке, пока их не потребуют, но это только начало.
2) просто отключите своп
Я знаю, что этоспорная тема, но для настольных систем и особенно машин разработки, где время от времени может случаться, что процесс пытается съесть всю вашу память, это имеет смысл: без подкачки OOM killer просто работает так, как и задумано. Когда у вас заканчивается память, он находитлучший процесс, чтобы убитьи избавляется от этого. Никаких задержек, никаких отставаний.
Вы можете отключить подкачку для текущего сеанса с помощью sudo swapoff -a
илисделать изменение постоянным.
Конечно, правильным решением проблемы было бы то, что система оставалась бы отзывчивой, когда основная память исчерпана и она начинает подкачивать память так, словно завтра не наступит никогда, но, похоже, в ближайшее время этого не произойдет.
решение2
От +22.04 LTS
Есть служба systemd-oomd, которая автоматически отслеживает использование памяти и пытается завершить процессы при ее нехватке, и она установлена по умолчанию как часть systemd. Чтобы просмотреть текущий статус, введите oomctl
. Пример вывода:
Dry Run: no
Swap Used Limit: 90.00%
Default Memory Pressure Limit: 60.00%
Default Memory Pressure Duration: 20s
System Context:
Memory: Used: 4.1G Total: 15.5G
Swap: Used: 1.0G Total: 3.9G
Swap Monitored CGroups:
Path: /
Swap Usage: (see System Context)
Memory Pressure Monitored CGroups:
Path: /user.slice/user-1000.slice/[email protected]
Memory Pressure Limit: 50.00%
Pressure: Avg10: 0.00 Avg60: 0.02 Avg300: 0.00 Total: 9s
Current Memory Usage: 3.9G
Memory Min: 0B
Memory Low: 0B
Pgscan: 23663084
Last Pgscan: 23663084
По умолчанию, начать восстановление при 90% использовании как памяти, так и подкачки. Он использует давление памяти на группы управления пользовательскими слайсами (т.е.[email protected]), где появляется большинство приложений, но не в группе управления system.slice, которая порождает наиболее важные компоненты системы, такие как NetworkManager и Gnome Display Manager. Короче говоря, oomd освободит пользовательские процессы перед системными. Чтобы просмотреть текущую конфигурацию systemd-oomd, введите:
systemd-analyze cat-config systemd/oomd.conf
Ссылаться наэта страницадля справки о том, что они делают. Чтобы изменить параметры OOM определенного блока systemd, добавьте или отредактируйте указанные переменныездесьв файле блока.
решение3
Попробуйте сделать одно из двух:
1) изменить настройку swappiness с ее значения по умолчанию 60 на 10,т.е.: добавитьvm.swappiness = 10в /etc/sysctl.conf(в терминале введите sudo gedit /etc/sysctl.conf
), затем перезагрузите систему. Найдите здесь swappiness для получения дополнительной информации об этом.
2) Если подкачка не помогает... даже если вы этого не хотите... увеличьте размер файла подкачки до 1,5x16G и посмотрите, поможет ли это.
Держи меня в курсе. Привет, Эл.