两个进程,分别称为 A 和 B,
A 优先级高,B 优先级低
我想将这两个进程的总 CPU 使用率限制在 80% 以下
有时 A 什么都没做,cpu 使用率为 0%,此时希望 B 执行并占用 80% cpu
有时 A 正在工作,cpu 使用率为 80%,此时希望 B 什么都没做,不使用 cpu(或者只使用一点点,1%)
有时 A 占用了 30% 的 cpu,此时 B 应该占用 50% 的 cpu
我在 Ubuntu 20.04 下,有什么办法吗?
答案1
为了准确起见,你可能需要使用cgroups。
这是我在 Ubuntu 20.04 上测试的一个简单的示例。为简单起见,这是一个单 CPU VM,所有命令均以 root 身份运行。
- 安装工具
apt-get install cgroup-tools stress
- 创建一个 cgroup 层级,该层级将受 CPU 限制。父级已命名
max80
,其下有A
和B
。
cgcreate -g cpu:max80/A -g cpu:max80/B
- 将父 cgroup 限制
max80
为 CPU 的 80%。
echo 1000000 > /sys/fs/cgroup/cpu/max80/cpu.cfs_period_us
echo 800000 > /sys/fs/cgroup/cpu/max80/cpu.cfs_quota_us
- 限制子 cgroup
B
拥有 10% 的份额。您在帖子中提到了 1%,但 10% 更容易说明。B
将使用所有可用的 CPU,但如果存在进程争用,A
则将限制为 10%。
echo $((1024 * 10 / 100 )) > /sys/fs/cgroup/cpu/max80/B/cpu.shares
实际应用
stress
只需 即可运行一个进程。执行该工作的进程A
的 CPU 使用率将达到 80% 。stress
root@ubuntu:~# cgexec -g cpu:max80/A stress --cpu 1 &
[1] 2040
stress: info: [2040] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
root@ubuntu:~# ps -o pid,%cpu,cmd --sort -%cpu -p $(pidof stress)
PID %CPU CMD
2041 80.4 stress --cpu 1
2040 0.0 stress --cpu 1
root@ubuntu:~# killall stress
stress
只需 即可运行一个进程B
。CPU 使用率将达到 80%。
root@ubuntu:~# cgexec -g cpu:max80/B stress --cpu 1 &
[1] 2065
stress: info: [2065] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
root@ubuntu:~# ps -o pid,%cpu,cmd --sort -%cpu -p $(pidof stress)
PID %CPU CMD
2066 80.6 stress --cpu 1
2065 0.0 stress --cpu 1
root@ubuntu:~# killall stress
- 在和中运行一个
stress
进程。CPU 使用率将分为 90%/10%。A
B
root@ubuntu:~# cgexec -g cpu:max80/A stress --cpu 1 &
[1] 2078
stress: info: [2078] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
root@ubuntu:~# cgexec -g cpu:max80/B stress --cpu 1 &
[2] 2080
stress: info: [2080] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
root@ubuntu:~# ps -o pid,%cpu,cmd --sort -%cpu -p $(pidof stress)
PID %CPU CMD
2079 71.9 stress --cpu 1
2081 7.2 stress --cpu 1
2078 0.0 stress --cpu 1
2080 0.0 stress --cpu 1
root@ubuntu:~# killall stress
链接