Поддерживайте производительность сервера с помощью systemd

1305
user116804

Я хотел бы выполнить длительную задачу с интенсивным использованием памяти, не влияя на производительность моего сервера. Мой сервер имеет 4 ГБ оперативной памяти, и я создал файл подкачки 30 ГБ.

Существует очень требовательная к памяти программа (которая выполняет сложные запросы к огромной базе данных), которая - через некоторое время - настолько сильно нагружает сервер, что я даже не могу войти через ssh.

Мой план состоял в том, чтобы ограничить ресурсы этой программы через systemd. Во-первых, предотвратите замену пользовательских и системных программ:

# systemctl edit user.slice [Slice] MemorySwapMax=0 

А также

# systemctl edit system.slice [Slice] MemorySwapMax=0 

Затем создайте фрагмент для программы, интенсивно использующей память:

[Slice] CPUAccounting=true CPUShares=512 MemoryLimit=1G MemoryMax=1.1G MemorySwapMax=infinity 

Это должно помешать программе использовать более 1 ГБ ОЗУ, но позволяет менять ее так, как она хочет - верно?

К сожалению, это не работает. Либо программа будет убита, либо сервер через некоторое время будет недоступен (при игре со значениями).

Это то, что мне нравится делать, возможно? Если так, как бы я это сделал?

Изменить: мое решение

echo 100 > /sys/fs/cgroup/memory/<myswappingslice>.slice/memory.swappiness echo 0 > /sys/fs/cgroup/memory/user.slice/memory.swappiness echo 0 > /sys/fs/cgroup/memory/system.slice/memory.swappiness 

Это все. Я назначаю сервис, потребляющий память, для .slice, чтобы он активно менялся и не занимал всю оперативную память. Благодаря предотвращению обмена user.slice и system.slice общая производительность сервера не подвергается негативному влиянию.

1
У вас есть физический сервер или арендованный виртуальный сервер? Если вы арендуете виртуальный сервер, хост может иметь дополнительные ограничения на использование вашего ресурса. Mark Stosberg 7 лет назад 0

2 ответа на вопрос

0
Mark Stosberg

MemorySwapMax=Директива была введена в Systemd 232. Если вы используете старую версию, эта директива не может быть доступна для вас.

Директивы не названы MemoryMax=, но есть MemoryLimit=.

См. man systemd.directivesСписок всех директив в установленной вами версии systemd, включая ссылки на manстраницы, на которых они документированы.

0
Moscato

MemoryMax = существует, но он довольно новый, и старые версии systemd могут его не использовать.

Проверьте документацию здесь.

https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html

Похожие вопросы