Да, это широкий вопрос, но я бы сказал, вполне обоснованный. Иногда программы и сценарии занимают слишком много времени или используют слишком много памяти и действительно начинают тормозить мою систему. Хорошо. Иногда система тормозит так сильно, что я едва могу показать свою мышь в терминале и спамить Ctrl+C. Меня сбивает с толку то, почему ОС не дает приоритета планирования, чтобы позволить пользователю использовать мышь, клавиатуру и убивать вещи. Вы когда-нибудь видели это?
> ./program
^C^C^C^C^C^C^C^C^C^C^C^Z^Z^Z^C^C^C^C^C^Clsdhafjkasdf
Теперь Ctrl+C не такой строгий, как некоторые другие (он может обрабатываться приложением и даже игнорироваться, но здесь это не так). Ctrl+Z тоже неплохо бы справился, так как я мог бы сразу kill -9 %1 но это тоже не сработало.
Другой способ может заключаться в том, чтобы перейти к виртуальной консоли Ctrl+Alt+F2, войти в систему и завершить работу приложения-нарушителя, но поскольку система занята, это не работает, и я получаю черный экран. Также я не могу открыть новые терминалы (окно всплывает, но не может бросить меня в оболочку). Другие открытые терминалы могут не отвечать или запускать команды.
Я подозреваю, что одна из причин, по которой система так неработоспособна, заключается в том, что программа-нарушитель запускает функцию свопинга и выталкивает больше основных приложений из основной памяти. Даже самая простая команда, чтобы дать мне приглашение bash или выполнить kill, не может получить цикл на ребре. У меня нет доказательств этого , потому что я не могу бежать top , когда это произойдет. Есть ли варианты, чтобы улучшить шансы оригинального Ctrl+C работает? , Может быть, что-то вроде увеличения X и терминального приоритета или автоматического уничтожения программ, которые используют большую часть памяти или начинают переставлять слишком много?
Есть ли другой linux-fu, который я мог бы использовать, чтобы восстановить контроль, когда это происходит (например, команды SysRq )?
Обновление: после нескольких тестов я почти уверен, что приложения используют слишком много памяти и переключаются. Даже после того, как приложение было убито, другим нужно очень много времени, чтобы начать реагировать, как если бы они были вытеснены из основной памяти. Мне бы очень хотелось, чтобы какой-то способ автоматически ограничивал использование программ с большим объемом памяти основной памятью. Если он достигнет свопа, он все равно будет слишком медленным, поэтому какой смысл продолжать его.
ПРИМЕЧАНИЕ: я не ищу решение для конкретного приложения и не знаю заранее, когда какая-то операция собирается сжечь память. Я хочу решить этот вид замедления всей системы. Т.е. многие программы вызывают это. AFAIK Я не испортил конфигурацию системы, и это довольно стандартная установка Fedora. Я не удивлен этими замедлениями, но я хочу больше контроля.
Я хотел бы, чтобы мой оконный менеджер работал, и это мои последние курорты, которых я надеюсь избежать. Как правило, они нужны только в том случае, если мой графический процессор застрял в цикле и блокирует X. Если этот параметр включен, Ctrl+Alt+backspace - это удобное сочетание клавиш для удаления X и всех ваших приложений, возвращающее вас к входу в систему. Более мощная команда, опять же, если она включена, это Alt+SysRq+K. Если это не работает, он удерживает кнопку питания во времени.
Alt+SysRq+F (спасибо, @Hastur), который убивает процессы захвата памяти, довольно разрушителен, но может помочь в качестве последнего средства.
Обновление: Не совсем уверен во всех последствиях здесь, но предложение ulimit @ Xen2050, похоже, решает многие проблемы ...
TOTAL_PHYSICAL_MEMORY=$(grep MemTotal /proc/meminfo | awk '{print $2}')
ulimit -Sv $(( $TOTAL_PHYSICAL_MEMORY * 4 / 8))
Собираюсь оставить это в моем bashrc и посмотреть, как идут дела.
Обновление: в основном все выглядит хорошо, за исключением, я думаю, некоторых приложений, которые используют большие библиотеки и отображают большие файлы. Даже если они потребляют только какую-то фактическую память и вряд ли будут часто менять своп. Кажется, не хватает числа, достаточного для того, чтобы убить смертельно опасные приложения подкачки, но оставьте работающими обычные (такие как 4.6 ГБ VIRT amarok).
Связанный: https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894, но по-прежнему проблема ограничения приложения, которые начинают бить, меняются местами.
Это именно то решение, которое, как выясняется, мне нужно: возможно ли заставить убийцу ООМ вмешаться раньше?
