81 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Markdown
		
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Markdown
		
	
	
| ---
 | ||
| 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 удобный инструмент в плане управления лимитами процессов. Легко настраивать и управлять.
 | ||
| 
 | ||
| Считаю, что эта заметка достойна того, чтобы быть сохранённой в избранном.
 | ||
|  |