docs: create sysadmin/Linux/Base-znaniy/Memory-limit
parent
83bebf1836
commit
76e7277186
|
|
@ -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 удобный инструмент в плане управления лимитами процессов. Легко настраивать и управлять.
|
||||
|
||||
Считаю, что эта заметка достойна того, чтобы быть сохранённой в избранном.
|
||||

|
||||
Loading…
Reference in New Issue