Найти тему
Что-то на IT-шном

Отключение SWAP в OS Linux

В операционной системе linux иногда требуется отключить SWAP, часто для решения проблемы скорости отклика веб сервиса, и не только. Но прежде чем отключать "своп", он же "файл подкачки", убедитесь в том что ваша система "вынесет" это и отключение и отключение "свопа" не создаст новых проблем, а решит имеющиеся. Чтобы понять стоит ли отключать SWAP, необходимо разобраться что же такое SWAP и для чего он нужен и проанализировать что происходит с памятью.

Что такое SWAP и зачем он нужен?

Если коротко, "своп", это не используемая в текущий момент времени оперативная память приложений, перемещённая временно в файл на жёском или ещё хуже, твердотельном диске. У всех программ, не важно под какую операционную системы они написаны, есть разделение памяти, "выгружаемая" и невыгружаемая память (про память - это материал для отдельной статьи), так вот, в "своп" попадает выгружаемая память всех запущенных приложений, в те моменты времени когда ядро операционной системы решает, что этой памяти не место в оперативной памяти.

Когда стоит отключать SWAP?

На своём опыте я выявил два фактора, когда стоит отключать "своп", при которых отключение действительно принесёт пользу и ускорит работу приложений и сервисов, вот они:

  • Как ни парадоксально это звучит, "своп" стоит отключать только тогда, когда он не используется или используется крайне мало;
  • Так же, стоит отключать "своп" тогда, когда памяти действительно очень много, но не смотря на это, некоторые программы невозможно настроить и они всё равно стремятся занять всю память без исключения, а вдобавок ещё и весь "своп".

Как было сказано выше, у каждой программы есть выгружаемая и не выгружаемая память, так же есть участки кода, которые могут выполняться один раз за всё время работы программы. Такие участки кода вытесняются в "своп" и это даже очень полезно для операционной системы.

Как это выглядит: У вас "своп" размером, например, 1Гб и за сутки работы операционной системы он занят максимум на 10Мб - 100Мб. при этом ни одно приложение не "тормозит" и всё работает очень быстро. В этом случае вам не стоит отключать "своп", он выполняет очень полезную роль, содержит выгружаемую память приложений, которая не требуется приложениям для их нормальной работы.

Так когда же стоит отключать?

Отключать "своп" необходимо, когда вы видите примерно следующее: предположим у вас 64Гб - 192Гб памяти или больше, сразу после запуска операционной системы и всех приложений память занимается на 10%, а через сутки работы вы обнаруживаете что "своп" занят на 50% и все приложения или сервисы периодически "залипают" и время их отклика не линейное, а случайное. Такое поведение приложений часто видно при использовании приложений написанных на python, php, java (в защиту java стоит сказать о том что java приложение можно "отрегулировать" не вмешиваясь в код программы, указав в параметрах запуска сколько разрешено занимать памяти).

Когда вы ведите такую ситуацию, без вмешательства в код приложений вы можете исправить скорость работы приложений только отключением "своп".

К чему приведёт отключение SWAP?

Всё будет работать как обычно, но отклик любого приложения загруженного в память будет практически гарантированно стабильным. Так как операционной системе больше не потребуется искать "куски" выгружаемой памяти на диске в SWAP файле или разделе и подгружать их в моменты выполнения кода из выгруженной памяти.

Что будет если программе нужно больше памяти?

В случае если программе требуется больше памяти, а "своп" отключён, программа получит отказ и либо разберётся сама с отказом (деградирует часть функционала) либо упадёт с "паникой", в случае сервиса, настроенного на перезапуск, сервис перезагрузится, высвободив всю память. Вы увидите проблемное приложение которое либо написано не корректно либо имеет "утечку" памяти.

В случае если программе требуется больше памяти, и "своп" включён. Все без исключения приложения и сама операционна система будет сильно тормозить уже при заполненности свопа на 50% - 70% и выше, а при заполненности свопа на 100% вы увидите тот же самый отказ в выделении памяти и падение приложений, но только через 10 - 30 - 50 минут сильнейших "тормозов".

Как отключить SWAP в OS Linux?

Существует несколько вариантов отключения "своп", приведу наиболее распространённые из них.

Способ №1

Выполните команду:

swapoff --all

В результате выполнения команды "своп" отключится программно, но включится сам при перезагрузки операционной системы. Чтобы не произошло включение свопа, в современных Linux вам требуется удалить раздел "своп" либо сменить типа раздела, для этого выполните следующие действия:

sudo sed -i '/ swap / s/^/#/' /etc/fstab

Этой команды достаточно для домашних Linux типа "убунту", но энтерпрайз linux сами находят "своп", даже если нет записи в /etc/fstab, но раздел существует. Для этого зайдите в редактор резделов дисков и измените тип раздела "Partition ID" со значения "Linux Swap" на "Linux", либо удалите раздел "Linux Swap".

Способ №2

Я использую способ отключения "свопа", который является одновременно и постоянным и временным, так как в любой момент времени можно отключить "отключение" "свопа". Суть способа в том чтобы отключить своп программно с момент загрузки операционной системы, для этого я использую systemd и сервис с типом oneshot.

Создайте файл сервиса командой:

touch /etc/systemd/system/swapoff.service

С помощью команды nano:

nano /etc/systemd/system/swapoff.service

Впишите в файл следующее содержимое:

[Unit]
Description=Отключение SWAP после старта
After=local-fs.target swap.target emergency.service emergency.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/sbin/swapoff --all

[Install]
WantedBy=sysinit.target

Включите сервис и запустите его следующими командами:

systemctl enable swapoff.service
systemctl start swapoff.service

Командой "статус", вы можете посмотреть состояние сервиса:

systemctl status swapoff.service
● swapoff.service - Отключение SWAP после старта
Loaded: loaded (/etc/systemd/system/swapoff.service; enabled; vendor preset: disabled)
Active: active (exited) since Wed 2023-09-06 17:44:46 MSK; 1h 36min ago
Main PID: 14461 (code=exited, status=0/SUCCESS)

Sep 06 17:44:46 webdesk-gw-vps systemd[1]: Starting Отключение SWAP после старта...
Sep 06 17:44:46 webdesk-gw-vps systemd[1]: Finished Отключение SWAP после старта.

И так же убедиться в том что размер SWAP равен 0 байт, то есть он отключён, командой:

free -mh
# free -mh
total used free shared buff/cache available
Mem: 7.7Gi 742Mi 6.2Gi 9.0Mi 1.1Gi 7.0Gi
Swap: 0B 0B 0B

Данный способ позволяет вам в любой момент включить "своп", для этого достаточно отключить запуск сервиса командой:

systemctl disable swapoff.service

И перезагрузить операционную системы Linux.