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








Комментарии
Виджет комментариев загружается с серверов Telegram и может использовать cookies. Разрешите внешние сервисы, чтобы открыть обсуждение.