cgroup可以限制CPU的使用率,那么这个使用率是否包括CPU sysIO wait呢?我们可以做一个小测试就可以知道。

创建资源组

准备一个资源组,CPU率限制为一个CPU核的50%:

snippet.bash
[root@bogon ~]# mkdir /sys/fs/cgroup/cpu/yz/
[root@bogon ~]# chown yz:yz -R /sys/fs/cgroup/cpu/yz/
[root@bogon ~]# cd /sys/fs/cgroup/cpu/yz/
[root@bogon yz]# cat cpu.cfs_period_us
100000
[root@bogon yz]# echo 50000 > cpu.cfs_quota_us

CPU user

以下代码可以持续占用CPU user

snippet.c
int a = 1;
while (1)
{
  ++a;
}

编译执行程序,将PID加入上述资源组。改资源组的CPU(CPU user)使用率由100%降到了不到50%。

CPU sys

以下代码可以持续占用CPU sys

snippet.bash
#include <time.h>
 
int main()
{
    clock_t start;
    while (1)
    {
        start = clock();
    }
    return 0;
}

编译执行程序,将PID加入上述资源组。改资源组的CPU(CPU sys)使用率由100%降到了不到50%。

CPU wait

可以使用dd的direct模式,构建iowait场景。

cgexec -g "cpu:yz/" dd if=/dev/zero of=./big.txt bs=1M oflag=direct

可以发现iowait不受限制。

结论

CPU userCPU sys使用率受cgroup控制,但是iowait不受限。