Кнопка «Убить самый большой процесс»

14

Этот ноутбук имеет SSD, и поэтому я решил пропустить обмен. В большинстве случаев это работает хорошо, но иногда ОЗУ становится немного коротким, а компьютер становится очень вялым и склонен зависать. Есть ли способ реализовать кнопку «убить самый большой процесс», которая идет прямо к ядру в случае, если я замечаю достаточно быстрое замораживание? Или, потому что это компьютер, эвристика, когда он начинает зависать и снимать самый большой процесс, тоже подойдет.

Reactormonk
источник
Вы имеете в виду команду "убить самый большой процесс"?
Рамеш
У Linux есть это. Это называется убийцей ООМ. Но вы должны включить overcommit памяти (и он включен по умолчанию в большинстве дистрибутивов).
Патрик
@ Патрик overcommit_memoryесть 0, overcommit_ratioесть 50.
Reactormonk

Ответы:

12

Из вашего комментария звучит так, будто система просто меняет местами.

В Linux есть OOM killer, который вызывается, когда система перегружает свою память, и теперь он исчерпан.
Linux по умолчанию выполняет переполнение памяти, что в основном означает, что он дает программам больше памяти, чем в действительности имеет система. Это делается при условии, что программы на самом деле не будут использовать всю запрашиваемую память. Однако, когда системе не хватает памяти, она уже сказала различным запущенным процессам, что у них есть память, поэтому она больше не может просто отрицать это. Вместо этого он вызывает убийцу OOM. Убийца OOM в основном находит процесс, который, как думает ядро, уменьшит состояние нехватки памяти. Обычно это просто процесс, использующий наибольшее количество памяти, но алгоритм на самом деле гораздо более сложный, чем этот.

Поскольку вы overcommit_memoryустановили 0(автоматический режим), ядро ​​выполняет избыточную память. Итак, из вашего объясненного поведения, похоже, что система просто сильно менялась.

Отсюда есть 2 варианта.

Уменьшить своп

Ваша система исчерпывает ОЗУ, и поэтому ядро ​​начинает загружать вещи в swap. Если в вашей системе заканчивается своп, то она вызывает убийцу OOM. Однако, поскольку у вас остается свободное место подкачки, этого не происходит.

Ваша оригинальная идея, вручную убить процесс.

Вы можете вручную завершить процесс, если вы думаете, что система слишком сильно менялась и что-то должно умереть. Это можно сделать через триггеры ядра SysRq.

В ядре есть то, что называется «волшебный SysRq». Это небольшая функциональность, которая сообщает ядру о необходимости выполнить экстренную операцию. Это могут быть такие вещи, как «перемонтировать все тома только для чтения», «синхронизировать все файловые системы» или «перезагрузить сейчас». Один из этих вариантов - также вызвать убийцу OOM.

Если в вашем ядре включен магический SysRq (опция ядра CONFIG_MAGIC_SYSRQ), вы можете сделать это двумя способами.

  1. Alt+ SysRq+ f
    Просто нажмите эти 3 клавиши на клавиатуре.
  2. echo f > /proc/sysrq-trigger
    Это выполнит ту же задачу, что и метод с клавиатурой, но делает это программно.

Вы также можете полностью отключить swap, и это то, что я делаю на большинстве моих систем, и именно по этой причине. Своп выгоден тем, что ядро ​​превентивно заменяет данные, которые не используются, что позволяет большему количеству оперативной памяти использоваться для кэширования. Но это приводит к проблеме принудительного обмена, которую вы видите.

Я лично считаю, что лучшее решение - это какая-то опция ядра для вызова OOM killer при принудительной замене. По сути, пусть превентивный своп работает, но если ядро ​​вынуждено что-то перенести в своп, потому что у вас недостаточно ОЗУ, тогда вызовите OOM killer.
К сожалению, это только мое личное желание. Это не делает этого.

Патрик
источник
Я не знал о OOM Killer. Я думал о скрипте, который постоянно следит за использованием памяти с помощью команды topили, psи если он превышает определенный порог, убивает этот процесс с помощью killкоманды.
Рамеш
Я не использую своп.
Reactormonk
чтобы увидеть, какой процесс был убит наёмным убийцей:grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1
Лесмана
@Tass О, я полностью остолбенел над комментарием «Я решил опустить своп», извините :-(. Хотя информация «вручную убить процесс» все еще остается. Однако вы не должны испытывать медлительность при нехватке памяти. Вы Я должен испытать ядро, просто убивая вещи.
Патрик
@ Патрик, что происходит, но через ~ 30 минут.
Reactormonk