Systemd

使用 cgroups/systemd 限制每個使用者的資源使用

  • July 9, 2020

Debian 10:我想限制所有使用者的記憶體、CPU 等,除了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讓 systemd 重新讀取它們。此外,受影響的單位需要重新啟動。

也就是說,如果您希望更改適用於所有使用者,您可能應該改寫為覆蓋user.slice。當然,您永遠不應該編輯系統提供的文件,而是通過drop-in files使用覆蓋。

引用自:https://serverfault.com/questions/1024599