Мы все это испытали - какую-то программу просят сделать что-то, что требует огромного количества памяти. Он покорно пытается распределить всю эту память, и система сразу же начинает биться, бесконечно менять местами и становится вялой или не реагирующей.
Я недавно испытал это на своем ноутбуке Ubuntu из-за сценария Matlab, пытающегося выделить смехотворно огромную матрицу. После ~ 5 + минут разгрома я смог Ctrl-F1 к консоли и убить Matlab. Я бы предпочел иметь какую-нибудь горячую клавишу, которая сразу же дала бы мне контроль над системой и позволила бы мне убить процесс оскорбления; или, может быть, просто молча откажитесь выделить такой большой буфер.
Каков самый быстрый способ восстановить контроль над системой Linux, которая перестала отвечать или стала очень вялой из-за чрезмерной подкачки?
Существует ли эффективный способ предотвратить такой обмен в первую очередь, например, путем ограничения объема памяти, который процессу разрешено пытаться выделить?
Уже ответил выше с Alt-SysRq-F
Я отвечаю на эту 2-ую часть. Да,
ulimit
все еще работает достаточно хорошо, чтобы ограничить один процесс. Вы можете:Также, как кратко сказано:
Действительно, cgroups предлагает более продвинутый контроль, но в настоящее время, по моему мнению, его сложнее настроить.
Старая школа ulimit
Один раз
Вот простой пример:
Это:
r2(){ r2 $@$@;};r2 r2
, который экспоненциально нагружает ЦП и ОЗУ, бесконечно удваивая себя при запросе стековой памяти.Как видите, он остановился при попытке запросить более 1 ГБ.
Обратите внимание,
-v
работает с распределением виртуальной памяти (всего, то есть физической + подкачки).Постоянная защита
Чтобы ограничить выделение виртуальной памяти,
as
это эквивалент-v
дляlimits.conf
.Я делаю следующее, чтобы защитить себя от любого неправильного поведения:
address space limit = <physical memory> - 256MB
,Один лайнер:
Для проверки это приводит к следующему (например, в системе 16 ГБ):
Примечания:
rss
опцию в limit.conf. Это не соблюдается новыми ядрами.Более новые CGroups
Предлагает больше контроля, но в настоящее время более сложный в использовании:
memory.max_usage_in_bytes
может учитывать и ограничивать физическую память отдельно.ulimit -m
и / илиrss
вlimits.conf
предназначалось , чтобы предложить подобную функциональность, но это не работает , так как ядро Linux 2.4.30!cgroup_enable=memory swapaccount=1
.cgm
теперь кажется официально поддерживаемым инструментом для пользователей.Например, чтобы проверить текущие настройки:
Например, чтобы ограничить память одного процесса:
Чтобы увидеть это в действии, пережевывающее ОЗУ как фоновый процесс и затем убитое:
Обратите внимание на экспоненциальный (степень 2) рост количества запросов памяти.
Будем надеяться, что в будущем «дистрибутив / вендоры» предварительно сконфигурируют приоритеты и ограничения cgroup (через модули systemd) для таких важных вещей, как SSH и графический стек, чтобы они никогда не испытывали недостатка памяти.
источник
Вы можете нажать Ctrl- zчтобы приостановить программу. Затем вы можете сделать
kill %1
(или любой другой номер работы, или вы можете использовать PID).Вы можете использовать
ulimit
команду, чтобы попытаться ограничить объем памяти, доступный для процесса.источник
kill -STOP <pid>
который будет делать то же самое, что Ctrl-Z.Вы можете использовать CGroups для ограничения использования ресурсов и предотвращения таких проблем: https://en.wikipedia.org/wiki/Cgroups
источник
Всегда есть классическая
xkill
команда (из xorg-x11-apps-7.4-14.fc14.src.rpm в моей системе). Я предполагаю, что не должно быть слишком сложно создать клон, который посылает SIGSTOP вместо того, чтобы убивать целевое окно.источник