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

Задача от заказчика: У меня есть приложение, которое уходит в swap, мне нужно чтобы оно туда не уходило. Сам swap отключать нельзя.

Задаю очевидный вопрос — а зачем? Чтобы что? Ну свапится оно, ну и пусть свапится, никогда с этим проблем ни у кого не встречал.

Как оказалось, они там провели у себя какие-то хитрые тесты и доказали, что если их приложение начинает свапится, то это влияет на скорость его работы. Ну да, есть в этом доля правды. Если на сервере достаточно RAM, можно и реализовать это безобразие.

А решается эта задача через cgroups.

cgroups (Control Groups) представляют собой механизм в ядре Linux для ограничения, изоляции и управления ресурсами, предоставляемыми группам процессов. Они предоставляют интерфейс для создания и управления группами процессов, а затем накладывают ограничения на ресурсы, потребляемые этими группами.

Сначала ставим необходимые пакеты, если они не стоят:

apt-get install cgroup-tools

Создаем отдельную группу asshole, в нее будем добавлять приложения, которые нужно оградить от swap:

cgcreate -g memory,cpu:/asshole

Запрещаем вытеснять процессы в swap:

echo 0 | tee /sys/fs/cgroup/asshole/memory.swap.max

Добавляем процесс в группу asshole:

cgclassify -g memory,cpu:/asshole/ $(pidof nginx)

Для примера я добавил nginx, который не будет уходить в swap. Но ты можешь добавить все что угодно.

Дополнительно для группы asshole отключим OOM:

echo 1 | tee /sys/fs/cgroup/asshole/memory.oom.group

Вот и всё, теперь приложение не будет уходить в swap и OOM (Linux Out-Of-Memory Killer) обломается. Ну и как вариант: всё нахуй встанет раком, продакшен издаст последний вздох и упадет в новогодние праздники. Но тут, как говорится — хозяин барин! Хотели отключить, отключили.

Все настройки производились на ubuntu 22.04, в других версиях есть различия на названия memory.swap.max, memory.oom.group и прочее.

После создания группы, зайди, посмотри что у тебя там создалось. И от туда уже пляши. У меня этот способ не сработал на виртуальных серверах в Селектеле (permissions denied), но прекрасно сработал в Digital Ocean и на локальной виртуалке.

Экспериментируйте! Кстати после перезагрузки, cgroups слетят и по возможности создавай юнит в systemd, типа такого:

/etc/systemd/system/asshole.service

[Unit]
Description=My cgroup configuration

[Service]
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/asshole
ExecStartPre=/bin/mount -t cgroup -o memory asshole /sys/fs/cgroup/asshole
ExecStart=/bin/echo 1 > /sys/fs/cgroup/asshole/memory.oom.group

[Install]
WantedBy=default.target
systemctl daemon-reload
systemctl start asshole
systemctl enable asshole

Хорошего понедельника!

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
И всегда помни, если что-то ограничиваешь, рано или поздно оно взбунтуется и сделает уйму головняков.