我可以限制正在运行的进程的CPU百分比及其当前和未来的所有子进程可以使用的组合吗?我听说过cpulimit
工具,但这似乎忽略了子进程。
修改:所以the answer我发现需要cpulimit
才能持续运行,直到我们希望限制保持有效,因为它通过主动发送暂停来进行限制然后继续向过程发出信号。是否有其他方法可以实现这种限制效果,也许不需要在后台运行这样的辅助过程?
答案 0 :(得分:7)
是!
就像我写这个问题一样,发现我正在尝试使用cpulimit
的旧版本。
new version也支持限制子进程。
$ cpulimit -h
Usage: cpulimit [OPTIONS...] TARGET
OPTIONS
-l, --limit=N percentage of cpu allowed from 0 to 400 (required)
-v, --verbose show control statistics
-z, --lazy exit if there is no target process, or if it dies
-i, --include-children limit also the children processes
-h, --help display this help and exit
TARGET must be exactly one of these:
-p, --pid=N pid of the process (implies -z)
-e, --exe=FILE name of the executable program file or path name
COMMAND [ARGS] run this command and limit it (implies -z)
Report bugs to <marlonx80@hotmail.com>.
答案 1 :(得分:0)
最近几天我一直在研究此问题,并且我发现至少还有两个选择:cgroups和CPU亲和力
鉴于该主题已被浏览超过2000次,并且很难找到一个好的信息来源,因此请在此处发表我的笔记以供将来参考。
注意事项:您不能在Docker内部使用cgroup,并且需要root访问权限才能进行一次性设置。
有cgroups v1
和v2
。截至2020-04-22,默认情况下只有Red Hat切换到v2,并且您不能同时使用两者。也就是说,您可能正在使用v1。
您需要root才能创建一个cgroup目录/将您的系统配置为在启动时创建一个cgroup目录,并将访问权限委派给您的非root用户,就像这样:
v1:mkdir /sys/fs/cgroup/cpu/<directory>/ && chown -R user /sys/fs/cgroup/cpu/<directory>/
(这专门用于限制CPU使用-其他cgroup'controller'使用不同的目录;一个进程可以在多个cgroup中)
v2:mkdir /sys/fs/cgroup/unified/<directory> && chown -R user /sys/fs/cgroup/unified/<directory>
(这是统一的cgroup层次结构,您可以通过单个cgroup控制所有cgroup的“控制器”;一个进程只能在一个cgroup中,并且该cgroup不能包含其他cgroup-例如叶子cgroup)
通过写入此树中的控制文件来配置cgroup:
使用cpu.cfs_quota_us
和cpu.cfs_period_us
(例如echo 10000 > cpu.cfs_quota_us
通过将进程的pid写入cgroup.procs
控制文件来将进程添加到新的cgroup。 (所有子进程都自动位于同一cgroup中。)
此链接具有更多信息: https://drill.apache.org/docs/configuring-cgroups-to-control-cpu-usage/
您只能使用CPU关联性将CPU使用率限制为整数个逻辑CPU(即CPU核心),而不是特定百分比。在当今的多核系统上,这可能已经足够了。
此功能的文档位于$ man sched_setaffinity
。请注意,cgroup还支持通过cpuset
控制器设置CPU亲和力。