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-control
systemd 中更多有用的 cgroup 设置。
不过,对此有两个警告,我(可能还有其他一些人)偶然发现了这些警告。这些警告真的很难追踪,因为似乎没有太多容易找到的信息,这是这个答案的主要原因。
该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_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
Run Code Online (Sandbox Code Playgroud)
对于设置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>
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)
它通过发送SIGSTOP
和SIGCONT
到附加的命令来暂停和恢复其操作。
AFAIK很难同时控制多个单独/独立的进程,就像将它们组合在一起一样,但也可能有解决方案......
归档时间: |
|
查看次数: |
11926 次 |
最近记录: |