Этот ноутбук имеет SSD, и поэтому я решил пропустить обмен. В большинстве случаев это работает хорошо, но иногда ОЗУ становится немного коротким, а компьютер становится очень вялым и склонен зависать. Есть ли способ реализовать кнопку «убить самый большой процесс», которая идет прямо к ядру в случае, если я замечаю достаточно быстрое замораживание? Или, потому что это компьютер, эвристика, когда он начинает зависать и снимать самый большой процесс, тоже подойдет.
14
overcommit_memory
есть0
,overcommit_ratio
есть50
.Ответы:
Из вашего комментария звучит так, будто система просто меняет местами.
В Linux есть OOM killer, который вызывается, когда система перегружает свою память, и теперь он исчерпан.
Linux по умолчанию выполняет переполнение памяти, что в основном означает, что он дает программам больше памяти, чем в действительности имеет система. Это делается при условии, что программы на самом деле не будут использовать всю запрашиваемую память. Однако, когда системе не хватает памяти, она уже сказала различным запущенным процессам, что у них есть память, поэтому она больше не может просто отрицать это. Вместо этого он вызывает убийцу OOM. Убийца OOM в основном находит процесс, который, как думает ядро, уменьшит состояние нехватки памяти. Обычно это просто процесс, использующий наибольшее количество памяти, но алгоритм на самом деле гораздо более сложный, чем этот.
Поскольку вы
overcommit_memory
установили0
(автоматический режим), ядро выполняет избыточную память. Итак, из вашего объясненного поведения, похоже, что система просто сильно менялась.Отсюда есть 2 варианта.
Уменьшить своп
Ваша система исчерпывает ОЗУ, и поэтому ядро начинает загружать вещи в swap. Если в вашей системе заканчивается своп, то она вызывает убийцу OOM. Однако, поскольку у вас остается свободное место подкачки, этого не происходит.
Ваша оригинальная идея, вручную убить процесс.
Вы можете вручную завершить процесс, если вы думаете, что система слишком сильно менялась и что-то должно умереть. Это можно сделать через триггеры ядра SysRq.
В ядре есть то, что называется «волшебный SysRq». Это небольшая функциональность, которая сообщает ядру о необходимости выполнить экстренную операцию. Это могут быть такие вещи, как «перемонтировать все тома только для чтения», «синхронизировать все файловые системы» или «перезагрузить сейчас». Один из этих вариантов - также вызвать убийцу OOM.
Если в вашем ядре включен магический SysRq (опция ядра
CONFIG_MAGIC_SYSRQ
), вы можете сделать это двумя способами.Просто нажмите эти 3 клавиши на клавиатуре.
echo f > /proc/sysrq-trigger
Это выполнит ту же задачу, что и метод с клавиатурой, но делает это программно.
Вы также можете полностью отключить swap, и это то, что я делаю на большинстве моих систем, и именно по этой причине. Своп выгоден тем, что ядро превентивно заменяет данные, которые не используются, что позволяет большему количеству оперативной памяти использоваться для кэширования. Но это приводит к проблеме принудительного обмена, которую вы видите.
Я лично считаю, что лучшее решение - это какая-то опция ядра для вызова OOM killer при принудительной замене. По сути, пусть превентивный своп работает, но если ядро вынуждено что-то перенести в своп, потому что у вас недостаточно ОЗУ, тогда вызовите OOM killer.
К сожалению, это только мое личное желание. Это не делает этого.
источник
top
или,ps
и если он превышает определенный порог, убивает этот процесс с помощьюkill
команды.grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1