From 76e72771866f36719442d0d9c9f2f3085b53a652 Mon Sep 17 00:00:00 2001 From: Administrator Date: Fri, 9 Aug 2024 07:34:42 +0000 Subject: [PATCH] docs: create sysadmin/Linux/Base-znaniy/Memory-limit --- sysadmin/Linux/Base-znaniy/Memory-limit.md | 81 ++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 sysadmin/Linux/Base-znaniy/Memory-limit.md diff --git a/sysadmin/Linux/Base-znaniy/Memory-limit.md b/sysadmin/Linux/Base-znaniy/Memory-limit.md new file mode 100644 index 0000000..78b8d71 --- /dev/null +++ b/sysadmin/Linux/Base-znaniy/Memory-limit.md @@ -0,0 +1,81 @@ +--- +title: Ограничение потребления памяти процессу +description: +published: true +date: 2024-08-09T07:34:35.655Z +tags: memory, limit +editor: markdown +dateCreated: 2024-08-09T07:34:35.655Z +--- + +Если вам нужно ограничить процессу потребление памяти, то с systemd это сделать очень просто. Причём там есть гибкие варианты настройки. Вообще, все варианты ограничения ресурсов с помощью systemd описаны в [документации](https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html). Там внушительный список. Покажу на примере памяти, какие настройки за что отвечают. + +◽️MemoryAccounting=1 +Включение подсчёта памяти (Turn on process and kernel memory accounting for this unit) + +◽️MemoryHigh=16G +Это основной механизм ограничения потребления памяти (This is the main mechanism to control memory usage of a unit). Указанный лимит может быть превышен, если это необходимо, но процесс при этом будет замедляться, а память у него активно забираться назад. + +◽️MemoryMax=20G +Жёсткий лимит по потреблению памяти. Если процесс до него дойдет, то он будет завершён OOM Killer. В общем случае этот лимит лучше не использовать, только в крайних случаях, чтобы сохранить работоспособность системы. + +◽️MemorySwapMax=3G +Ограничение по использованию swap. + +◽️Restart=on-abnormal +Параметр не имеет отношения к потреблению памяти, но добавил сюда для справки. Если хотите, чтобы процесс перезапускался автоматически после того, как его прибьют по превышению MemoryMax, то используйте этот параметр. + +◽️OOMPolicy=stop +Тоже косвенный параметр, который устанавливает то, как OOM Killer будет останавливать процесс. Либо это будет попытка корректно остановить процесс через stop, либо он его просто прибьёт через kill. Выбирайте в зависимости от того, что ограничиваете. Если у процесса жор памяти означает, что он завис и его надо прибить, то ставьте kill. А если он ещё живой и может быть остановлен, тогда stop. + +Параметры эти описываются в секции юнита [Service] примерно так: +``` +[Unit] +Description=Python Script +After=network.target + +[Service] +WorkingDirectory=/opt/run +ExecStart=/opt/run/scrape.py +Restart=on-abnormal + +MemoryAccounting=1 +MemoryHigh=16G +MemoryMax=20G +MemorySwapMax=3G +OOMPolicy=stop + +[Install] +WantedBy=multi-user.target +``` + +Потестировать лимиты можно в консоли. Для примера возьмём python и съедим гигабайт памяти: +``` +# python3 -c 'a="a"*1024**3; input()' +``` +Команда будет висеть без ошибок, по По ps или free -m будет видно, что скушала 1G оперативы. + +Теперь зажимаем её: +``` +# systemd-run --scope -p MemoryMax=256M -p MemoryHigh=200M python3 -c 'a="a"*1024**3; input()' +``` +Процесс работает, но потребляет разрешённые ему 200M. На практике чуть меньше. Смотрим через pmap: +``` +# ps ax | grep python +  767 pts/0  S+   0:00 /usr/bin/python3 -c a="a"*1024**3; input() + +# pmap 767 -x | grep total +total kB     1065048 173992 168284 +``` +Значения в килобайтах. Первое - виртуальная память (VSZ), сколько процесс запросил, столько получил. Занял весь гигабайт. Второе значение - RSS, что условно соответствует реальному потреблению физической памяти, и тут уже работает лимит. Реальной памяти процесс потребляет не больше лимита. + +RSS можно ещё вот так быстро глянуть: +``` +# ps -e -o rss,args --sort -rss +``` +Вообще, с памятью у Linux всё непросто. Кому интересно, я как-то пытался в этом разобраться и [рассказать простым языком] (https://t.me/srv_admin/2859). + +Systemd удобный инструмент в плане управления лимитами процессов. Легко настраивать и управлять. + +Считаю, что эта заметка достойна того, чтобы быть сохранённой в избранном. +![memory-limit.png](/sysadmin/img/memory-limit.png) \ No newline at end of file