Как завершить самый крупный процесс в не отвечающей системе Linux
Когда я открываю много вкладок в браузере, моя система перестает отвечать на запросы в течение нескольких минут. Я не мог переместить курсор мыши, завершить процесс или закрыть все открытые вкладки. В тот момент у меня не было другого выбора, кроме как принудительно перезагрузить систему. Я, конечно, использую расширения OneTab и Great Suspender, но они тоже не особо помогли. Мне часто не хватало памяти. В поисках решения этой проблемы я наткнулся на Early OOM. Для тех, кому интересно, Early OOM уничтожит самый большой процесс в не отвечающей системе, когда у него абсолютно нет другого выбора. Ранняя версия OOM проверяет объем доступной памяти и свободного подкачки 10 раз в секунду. Если оба значения ниже 10%, это приведет к уничтожению самого крупного процесса.
Почему ранний ООМ? Почему бы не встроенный убийца OOM?
Прежде чем идти дальше, позвольте мне дать краткое объяснение убийцы OOM, также известного как Out Of Memory killer. OOM killer — это процесс, который ядро использует, когда в системе критически мало памяти. Основная задача OOM killer — продолжать уничтожать процессы до тех пор, пока не будет освобождено достаточно памяти для бесперебойного функционирования остальной части процесса, который пытается запустить ядро. OOM killer выберет лучшие процессы, которые наименее важны для системы, освободит максимум памяти и убьет их. Мы можем просмотреть oom_score каждого процесса в каталоге /proc в разделе pid.
Пример :
$ cat /proc/10299/oom_score
1
Чем выше значение oom_score любого процесса, тем выше вероятность его уничтожения OOM Killer, когда в системе не хватает памяти.
Разработчик Early OOM утверждает, что у него есть одно большое преимущество перед встроенным убийцей OOM. Как я уже говорил ранее, убийца oom в Linux убивает процесс с наивысшим баллом, поэтому браузер Chrome всегда будет первой жертвой убийцы oom. Чтобы избежать этого, Early OOM использует /proc/*/status вместо echo f > /proc/sysrq-trigger. Он также утверждает, что запуск oom killer вручную может вообще не работать в последней версии ядра Linux.
Установить раннюю версию OOM
Ранняя версия OOM доступна в AUR, поэтому вы можете установить ее с помощью любых вспомогательных программ AUR в Arch Linux и его производных.
Использование Ура:
yay -S earlyoom
Включите и запустите демон Early OOM:
sudo systemctl enable earlyoom
sudo systemctl start earlyoom
В других дистрибутивах Linux скомпилируйте и установите его вручную, как показано ниже.
git clone https://github.com/rfjakob/earlyoom.git
cd earlyoom
make
sudo make install
Уничтожьте самый крупный процесс в не отвечающей системе Linux с помощью ранней версии OOM
Выполните следующую команду, чтобы запустить Early OOM:
earlyoom
Если вы скомпилировали его из исходного кода, выполните следующую команду, чтобы запустить Early OOM:
./earlyoom
Пример вывода будет:
earlyoom 0.12
mem total: 3863 MiB, min: 386 MiB (10 %)
swap total: 2047 MiB, min: 204 MiB (10 %)
mem avail: 1770 MiB (45 %), swap free: 2047 MiB (99 %)
mem avail: 1773 MiB (45 %), swap free: 2047 MiB (99 %)
mem avail: 1772 MiB (45 %), swap free: 2047 MiB (99 %)
mem avail: 1773 MiB (45 %), swap free: 2047 MiB (99 %)
mem avail: 1772 MiB (45 %), swap free: 2047 MiB (99 %)
mem avail: 1773 MiB (45 %), swap free: 2047 MiB (99 %)
mem avail: 1771 MiB (45 %), swap free: 2047 MiB (99 %)
mem avail: 1773 MiB (45 %), swap free: 2047 MiB (99 %)
mem avail: 1784 MiB (46 %), swap free: 2047 MiB (99 %)
[...]
Как вы видите в приведенном выше выводе, Early OOM отобразит, сколько у вас памяти и подкачки, каков минимум, сколько памяти доступно и сколько подкачки свободно. Помните, что он будет продолжать работать до тех пор, пока вы не остановите его вручную, нажав CTRL+C.
Если объем памяти и подкачки опускается ниже 10 %, Early OOM автоматически завершает самые крупные процессы до тех пор, пока в системе не будет достаточно памяти для бесперебойной работы. Вы также можете настроить минимальное процентное значение в соответствии с вашими требованиями.
Чтобы установить минимум доступной памяти равным ПРОЦЕНТУ от общего объема, выполните:
earlyoom -m <PERCENT_HERE>
Чтобы установить минимальный доступный своп равным ПРОЦЕНТУ от общего объема, выполните:
earlyoom -s <PERCENT_HERE>
Для получения более подробной информации обратитесь к разделу помощи.
$ earlyoom -h
earlyoom 0.12
Usage: earlyoom [OPTION]...
-m PERCENT set available memory minimum to PERCENT of total (default 10 %)
-s PERCENT set free swap minimum to PERCENT of total (default 10 %)
-M SIZE set available memory minimum to SIZE KiB
-S SIZE set free swap minimum to SIZE KiB
-k use kernel oom killer instead of own user-space implementation
-i user-space oom killer should ignore positive oom_score_adj values
-d enable debugging messages
-v print version information and exit
-r INTERVAL memory report interval in seconds (default 1), set to 0 to
disable completely
-p set niceness of earlyoom to -20 and oom_score_adj to -1000
-h this help text
Теперь вам не нужно беспокоиться о процессах с наибольшим потреблением памяти.
Ресурсы:
- Ранний репозиторий OOM на GitHub
- Обмен стеками Unix и Linux