Установить ограничение ресурса по умолчанию для всех пользователей с системными cgroups

9

Я могу установить ограничение памяти для пользователей следующим образом:

systemctl set-property user-UID.slice MemoryHigh=24G

Есть ли способ для этого применить для всех пользователей? Я бы хотел, чтобы каждый пользователь получал 24G, а не 24G для всех пользовательских процессов (что, я думаю, было бы результатом его user.sliceпрямой установки).

кай
источник

Ответы:

7

Кажется, нет официально поддерживаемого способа сделать это. (Это неверно. См. Внизу) Официально обескураженный способ (потому что он манипулирует cgroup) заключается в следующем:

Сделайте следующий файл как /etc/systemd/system/user@.service.d/set-memhigh.conf

[Service]
Type=simple
ExecStartPost=+/root/set-memoryhigh.sh %i

Затем сделайте следующий файл как "/root/set-memoryhigh.sh"

#!/bin/bash
exec >>/var/tmp/log.txt 2>&1 # for logging
set -x # for logging 
for d in /sys/fs/cgroup /sys/fs/cgroup/user.slice /sys/fs/cgroup/user.slice/user-$1.slice; do
  echo "+memory" >>${d}/cgroup.subtree_control
done
/bin/echo "24G" >> /sys/fs/cgroup/user.slice/user-$1.slice/memory.high

Вы можете увидеть, работает ли он или нет, запустив

cat /sys/fs/cgroup/user.slice/user-${UID}.slice/memory.high

Если «/sys/fs/cgroup/user.slice» не существует, то объединенная иерархия cgroup не включена. Мы должны включить его как https://unix.stackexchange.com/a/452728/297666

Хотя это работает, я не уверен, нравится ли вам это ...

Примечание, добавленное 25 июля: создание следующего файла /etc/systemd/system/user-1000.sliceдля каждого пользователя (замена 1000 на UID пользователя) накладывает ограничение на память для этого пользователя. Я проверил это на systemd 237 на ubuntu 18.04 и Debian strecth с systemd 237, установленным из stretch-backports:

[Slice]
Slice=user.slice
MemoryHigh=24G

Неудобство в том, что мы должны сделать вышеуказанный файл для каждого пользователя. С помощью systemd 239 мы можем создать вышеуказанный файл, так как /etc/systemd/system/user-.slice.d/memory.confограничение памяти накладывается на каждого пользователя. Но в systemd 239 есть ошибка (эта ошибка была исправлена ​​в 240), и она работает не так, как задумано. Чтобы обойти эту ошибку, создайте следующий файл as user-0.sliceи запустите systemctl enable user-0.slice. Нам не нужно делать следующий файл для каждого пользователя.

[Unit]
Before=systemd-logind.service
[Slice]
Slice=user.slice
[Install]
WantedBy=multi-user.target
Рютарох Мацумото
источник
Тем временем это выглядит как приличный обходной путь, но я постараюсь найти более официальную версию.
Кай
1
@kai Я нашел официальные способы ограничения памяти и добавил их в мой ответ выше. Надеюсь, что это полезно.
Рютаро Мацумото
1
Я проверю это, но это выглядит как раз то, что мне нужно (за исключением этой ошибки)
Кай