Привет. Давно не виделись, конец года, все как с ума посходили, всем нужно вчера и срочно. Надеюсь у тебя тоже все хорошо. Сегодня поделюсь задачей которую решал на днях для клиента, связанную со 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




Хорошего понедельника! И всегда помни, если что-то ограничиваешь, рано или поздно оно взбунтуется и сделает уйму головняков.



tags: #linux



💩 @bashdays