在 systemd 中使用 CPUQuota
我正在嘗試對 dd 命令的 CPU 使用設置硬性限制。我創建了以下單元文件
[Unit] Description=Virtual Distributed Ethernet [Service] ExecStart=/usr/bin/ddcommand CPUQuota=10% [Install] WantedBy=multi-user.target
它呼叫以下簡單腳本
#!/bin/sh dd if=/dev/zero of=/dev/null bs=1024k
正如我在本指南中看到的,我的服務的 CPU 使用率
dd
不應超過 10%。但是當我執行system-cgtop
命令時,使用率約為 70-75% 。關於我做錯了什麼以及如何解決它的任何想法?
當我執行時,
systemctl show dd
我得到以下關於 CPU 的結果CPUShares=18446744073709551615 StartupCPUShares=18446744073709551615 CPUQuotaPerSecUSec=100ms LimitCPU=18446744073709551615
好的
您的解決方案是正確的,實際上應該是面向未來的;通過使用 systemd 來控制服務 cgroup 設置,例如。CPU 配額。
[Unit] Description=Virtual Distributed Ethernet [Service] ExecStart=/usr/bin/ddcommand CPUQuota=10% [Install] WantedBy=multi-user.target
請參閱
man systemd.resource-control
systemd 中更多有用的 cgroup 設置。壞的
不過,對此有兩個警告,我(可能還有其他一些人)偶然發現了這兩個警告。這些警告真的很難追查,因為似乎沒有太多容易找到的資訊,這是這個答案的主要原因。
警告 1:
該
CPUQuota
設置僅在 systemd 213 之後可用,請參閱https://github.com/systemd/systemd/blob/master/NEWS* The CFS CPU quota cgroup attribute is now exposed for services. The new CPUQuota= switch has been added for this which takes a percentage value. Setting this will have the result that a service may never get more CPU time than the specified percentage, even if the machine is otherwise idle.
例如,只有 systemd 208 附帶的Debian Jessie存在問題。作為替代方案,可以使用 cgroup-bin 包進行配置和手動配置
cpu.cfs_period_us
,cpu.cfs_quota_us
例如。cgcreate``cgset
sudo cgcreate -g cpu:/cpulimited sudo cgset -r cpu.cfs_period_us=50000 cpulimited sudo cgset -r cpu.cfs_quota_us=10000 cpulimited sudo cgexec -g cpu:cpulimited /usr/bin/ddcommand
警告 2
為了設置
cpu.cfs_period_us
和cpu.cfs_quota_us
可用,核心需要使用 config-flag 進行編譯CONFIG_CFS_BANDWIDTH
。遺憾的是,預設情況下, Debian Jessie的 3.16.x 核心未使用此標誌編譯,請參閱此功能請求。不過,這將在Debian Stretch中可用。也可以使用來自jessie-backports的核心,它應該啟用該標誌。
我希望這個答案能幫助一些和我有同樣問題的人……
**PS:**測試 CPUquota 是否在您的環境中工作的簡單方法是:
$ apt-get install stress $ systemd-run -p CPUQuota=25% --slice=stress -- stress -c <your cpu count>
top
並使用or觀看htop
,負載應該(均勻地)分佈在所有 cpu/核心上,總計高達 25%。選擇
作為一種替代工具,可以使用大多數發行版中應該可用的 cpu-limit,例如。
$ apt-get install cpulimit $ cpulimit -l 10 -P /usr/bin/ddcommand
它通過發送
SIGSTOP
和SIGCONT
到附加的命令來暫停和恢復其操作。AFAIK很難同時控制多個單獨/獨立的程序,將它們組合在一起,但也可能有解決方案……