Привет. Давно не виделись, конец года, все как с ума посходили, всем нужно вчера и срочно. Надеюсь у тебя тоже все хорошо. Сегодня поделюсь задачей которую решал на днях для клиента, связанную со swap.
Задача от заказчика: У меня есть приложение, которое уходит в swap, мне нужно чтобы оно туда не уходило. Сам swap отключать нельзя.
Задаю очевидный вопрос — а зачем? Чтобы что? Ну свапится оно, ну и пусть свапится, никогда с этим проблем ни у кого не встречал.
Как оказалось, они там провели у себя какие-то хитрые тесты и доказали, что если их приложение начинает свапится, то это влияет на скорость его работы. Ну да, есть в этом доля правды. Если на сервере достаточно RAM, можно и реализовать это безобразие.
А решается эта задача через cgroups.
cgroups (Control Groups) представляют собой механизм в ядре Linux для ограничения, изоляции и управления ресурсами, предоставляемыми группам процессов. Они предоставляют интерфейс для создания и управления группами процессов, а затем накладывают ограничения на ресурсы, потребляемые этими группами.
Сначала ставим необходимые пакеты, если они не стоят:
Создаем отдельную группу asshole, в нее будем добавлять приложения, которые нужно оградить от swap:
Запрещаем вытеснять процессы в swap:
Добавляем процесс в группу asshole:
Для примера я добавил nginx, который не будет уходить в swap. Но ты можешь добавить все что угодно.
Дополнительно для группы asshole отключим OOM:
Вот и всё, теперь приложение не будет уходить в swap и OOM (Linux Out-Of-Memory Killer) обломается. Ну и как вариант: всё нахуй встанет раком, продакшен издаст последний вздох и упадет в новогодние праздники. Но тут, как говорится — хозяин барин! Хотели отключить, отключили.
Все настройки производились на ubuntu 22.04, в других версиях есть различия на названия
После создания группы, зайди, посмотри что у тебя там создалось. И от туда уже пляши. У меня этот способ не сработал на виртуальных серверах в Селектеле (permissions denied), но прекрасно сработал в Digital Ocean и на локальной виртуалке.
Экспериментируйте! Кстати после перезагрузки, cgroups слетят и по возможности создавай юнит в systemd, типа такого:
/etc/systemd/system/asshole.service
Хорошего понедельника! И всегда помни, если что-то ограничиваешь, рано или поздно оно взбунтуется и сделает уйму головняков.
tags: #linux
—
💩 @bashdays
Задача от заказчика: У меня есть приложение, которое уходит в 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
—