在 systemd 中使用 CPUQuota

Ste*_*015 13 linux cpu-usage systemd

我正在尝试对 dd 命令的 CPU 使用率进行硬限制。我创建了以下单元文件

[Unit]
Description=Virtual Distributed Ethernet

[Service]
ExecStart=/usr/bin/ddcommand
CPUQuota=10%

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

调用以下简单脚本

#!/bin/sh
dd if=/dev/zero of=/dev/null bs=1024k
Run Code Online (Sandbox Code Playgroud)

正如我在本指南中看到的我的dd服务的 CPU 使用率不应超过 10%。但是当我运行system-cgtop命令时,使用率约为 70-75% 。

关于我做错了什么以及如何解决它的任何想法?

当我执行时,systemctl show dd我得到以下关于 CPU 的结果

CPUShares=18446744073709551615
StartupCPUShares=18446744073709551615
CPUQuotaPerSecUSec=100ms
LimitCPU=18446744073709551615
Run Code Online (Sandbox Code Playgroud)

小智 17

好的

您的解决方案是正确的,实际上应该是面向未来的;通过使用 systemd 来控制服务 cgroup 设置,例如。CPU 配额。

[Unit]
Description=Virtual Distributed Ethernet

[Service]
ExecStart=/usr/bin/ddcommand
CPUQuota=10%

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

请参阅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.
Run Code Online (Sandbox Code Playgroud)

例如,这是Debian Jessie 的一个问题,它只随 systemd 208 一起提供。作为替代方案,可以从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
Run Code Online (Sandbox Code Playgroud)

警告 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>
Run Code Online (Sandbox Code Playgroud)

并使用top或观察htop,负载应该(均匀)分布在所有 CPU/内核上,总和为 25%。

选择

作为替代工具,可以使用大多数发行版中都应该提供的 cpu-limit,例如。

$ apt-get install cpulimit
$ cpulimit -l 10 -P /usr/bin/ddcommand
Run Code Online (Sandbox Code Playgroud)

它通过发送SIGSTOPSIGCONT到附加的命令来暂停和恢复其操作。

AFAIK很难同时控制多个单独/独立的进程,就像将它们组合在一起一样,但也可能有解决方案......