Linux

為什麼我的資源限制沒有得到尊重?

  • April 1, 2020

我想限制我係統上 docker 容器可用的 cpu 資源。我不想限制單個容器的資源消耗,而只限制所有容器的組合。

首先我創建了一個切片:

# /etc/systemd/system/limit-docker.slice
[Unit]
Description=Slice that limits docker resources
Before=slices.target

[Slice]
CPUAccounting=true
CPUQuota=300%

然後我配置了切片/etc/docker/daemon.json

{
  "cgroup-parent": "/limit-docker.slice"
}

然後我重新載入了 systemctl 並重新啟動了 docker

systemctl daemon-reload
systemctl restart docker

然後我啟動了一個容器並使用 systemd-cgls 確認該容器是控制組的一部分

-.slice
├─limit-docker.slice
│ └─49d07f9319edfd727d4e6211d5d41c15daf49bc57174100d1ab80e2352170d7e
│   └─13685 python app.py execute 

但是我指定的資源限制沒有得到遵守

Control Group                                                       Tasks   %CPU   Memory   
/limit-docker.slice                                                    34  388.3     3.5G         
/limit-docker.slice/4…211d5d41c15daf49bc57174100d1ab80e2352170d7e      34  388.3     3.3G 

我在 systemd 日誌中看到了幾個關於 cgroups 的警告

level=warning msg="Your kernel does not support swap memory limit"
level=warning msg="Your kernel does not support cgroup rt period"
level=warning msg="Your kernel does not support cgroup rt runtime"

我的理解是,這些 cgroup 與我想要實現的目標無關,它們不受支持也沒關係。它是否正確?

Operating System: Debian GNU/Linux 9 (stretch)
Kernel: Linux 4.4.182-xenomai-2 
systemd: 232
Docker: 18.06.1-ce

為什麼我的資源限制被忽略了?解決此問題的方法有哪些?

對於任何也在為此苦苦掙扎的人,而不是

systemctl daemon-reload
systemctl restart docker

做這個

systemctl daemon-reload
systemctl start limit-docker.slice
systemctl restart docker

引用自:https://unix.stackexchange.com/questions/574673