1

Я хотел бы выполнить длительную задачу с интенсивным использованием памяти, не влияя на производительность моего сервера. Мой сервер имеет 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 общая производительность сервера не подвергается негативному влиянию.

2 ответа2

0

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

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

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

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .