2

Да, это широкий вопрос, но я бы сказал, вполне обоснованный. Иногда программы и сценарии занимают слишком много времени или используют слишком много памяти и действительно начинают тормозить мою систему. Хорошо. Иногда система тормозит так сильно, что я едва могу показать свою мышь в терминале и спамить 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, но по-прежнему проблема ограничения приложения, которые начинают бить, меняются местами.


Это именно то решение, которое, как выясняется, мне нужно: возможно ли заставить убийцу ООМ вмешаться раньше?

2 ответа2

1

Ваш конкретный случай не похож на процесс, использующий весь доступный процессор, скорее на дисплей или, возможно, нехватку памяти. Ограничение ОЗУ должно быть возможно с помощью чего-то вроде cgroups или ulimit / user limit.

Но если вы хотите попробовать ограничить использование процессора некоторыми процессами, это может сработать:
Если вы точно знаете, какой процесс (ы) выполняется с вашим процессором, вы можете использовать cpulimit чтобы замедлить его. Я использую его регулярно в процессе с низким приоритетом, который иногда уходит с процессором, прекрасно работает. Это:

отправляет сигналы SIGSTOP и SIGCONT процессу, чтобы убедиться, что он может им управлять, и ограничить среднее количество потребляемого им ЦП. Это может привести к вводящим в заблуждение (раздражающим) сообщениям управления заданиями, которые указывают на то, что задание было остановлено (когда оно действительно было, но немедленно перезапущено). Это также может вызвать проблемы с интерактивными оболочками, которые обнаруживают или иным образом зависят от SIGSTOP/SIGCONT. Например, вы можете поместить задание на передний план, только чтобы сразу увидеть, что оно остановилось и перезапустилось на заднем плане. (См. Также http://bugs.debian.org/558763.)

На его странице руководства есть примеры запуска, например:

   Assuming you have started `foo --bar` and you find out with  top(1)  or
   ps(1) that this process uses all your CPU time you can either

   # cpulimit -e foo -l 50
          limits  the CPU usage of the process by acting on the executable
          program file (note: the argument "--bar" is omitted)

   # cpulimit -p 1234 -l 50
          limits the CPU usage of the process by acting  on  its  PID,  as
          shown by ps(1)

   # cpulimit -P /usr/bin/foo -l 50
          same as -e but uses the absolute path name
0

Вы можете установить приложение "xkill" и назначить "xkill" некоторым сочетаниям клавиш, таким как Ctrl+shift+k, и всякий раз, когда какой-либо скрипт или программа отстает, просто нажмите crtl+shift+k и нажмите на приложение, которое вы хотите убить. это оно

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .