Linux

在 systemd 中使用 CPUQuota

  • July 22, 2020

我正在嘗試對 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-controlsystemd 中更多有用的 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_uscpu.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_uscpu.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

它通過發送SIGSTOPSIGCONT到附加的命令來暫停和恢復其操作。

AFAIK很難同時控制多個單獨/獨立的程序,將它們組合在一起,但也可能有解決方案……

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