Назад | Перейти на главную страницу

Ограничение использования ресурсов для каждого пользователя с помощью cgroups / systemd

Debian 10: я хочу ограничить память, процессор и т. Д. Для всех пользователей, кроме root; Я нашел несколько статей об этом, но пока все они вращаются вокруг cgconfig, что, похоже, не так, как сейчас. Я видел несколько предложений использовать вместо этого срезы, поэтому для UID 1000 создайте что-то вроде:

# cat /lib/systemd/system/user-1000.slice
[Unit]
Description=User and Session Slice
Documentation=man:systemd.special(7)
Before=slices.target
MemoryHigh=20M

[Slice]
Slice=user-slice

[Install]
WantedBy=multi-user.target

и включите его с помощью systemctl enable user-1000.slice. Кажется, это половина работы:

 $ systemctl status user-1000.slice
Warning: The unit file, source configuration file or drop-ins of user-1000.slice changed on disk. Run 'systemctl daemon-reload' to reload units.
● user-1000.slice - User Slice of UID 1000
   Loaded: loaded (/lib/systemd/system/user-1000.slice; enabled; vendor preset: enabled)
  Drop-In: /usr/lib/systemd/system/user-.slice.d
           └─10-defaults.conf
   Active: active since Thu 2020-07-09 07:37:28 UTC; 1h 8min ago
     Docs: man:systemd.special(7)
           man:user@.service(5)
    Tasks: 7 (limit: 5237)
   Memory: 5.4M
   CGroup: /user.slice/user-1000.slice
           ├─session-15.scope
           │ ├─1089 sshd: jan [priv]
           │ ├─1107 sshd: jan@pts/1
           │ ├─1108 -bash
           │ ├─1113 systemctl status user-1000.slice
           │ └─1114 pager
           └─user@1000.service
             └─init.scope
               ├─1092 /lib/systemd/systemd --user
               └─1093 (sd-pam)

Тем не мение, MemoryHigh не установлено:

 $ systemctl show user-1000.slice
Slice=user.slice
ControlGroup=/user.slice/user-1000.slice
...
MemoryHigh=infinity
...

Кажется, я очень близок, но чего-то не хватает - что это?

Вы пропустили предупреждение, которое было напечатано на экране:

Warning: The unit file, source configuration file or drop-ins of user-1000.slice changed on disk. Run 'systemctl daemon-reload' to reload units.

Когда вы меняете единицы systemd, вы должны systemctl daemon-reload чтобы система перечитала их. Кроме того, необходимо перезапустить затронутые блоки.

Тем не менее, если вы хотите, чтобы изменение применялось ко всем пользователям, вам, вероятно, следует переопределить user.slice вместо. И, конечно же, вы никогда не должны редактировать файлы, поставляемые системой, вместо этого используйте переопределения через вставные файлы.