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