Fair Group Scheduling的使用方法

下面通过实例来讲解Fair Group Scheduling的使用方法。

使用前,需要挂载和安装Cgroup文件系统。由于使用了Cgroup进行资源控制,因此挂载时需要启用CPU资源控制。


mount-t cgroup-o cpu cgroup/cgroup


在本示例中将创建两个控制CPU资源的分组,分别为GroupA、GroupB。


mkdir/cgroup/GroupA

mkdir/cgroup/GroupB


为GroupA、GroupB这两个分组分配进程,从而在各分组间公平分享CPU时间。也就是说,GroupA和GroupB的CPU使用率都是50%。

然后,确认一下实际的CPU时间分配是否公平。打开一个新的终端,将shell进程分配给GroupA。


echo$$>/cgroup/GroupA/tasks


然后,在这个shell上形成死循环,使CPU利用率达到100%。


while:;do true;done


接着,向GroupB分配新的shell进程,在shell上形成死循环,使GroupB中的CPU使用率也达到100%。


echo$$>/cgroup/GroupB/tasks

while:;do true;done


在这个状态下使用top命令确认CPU使用率,可以发现各分组中shell(bash)的CPU使用率基本都是50%,GroupA和GroupB分别使用一半的CPU资源。


top-03:53:13 up 1 day,19:07,4 users, load average:1.35,0.42,0.14

Tasks:115 total,3 running,112 sleeping,0 stopped,0 zombie

Cpu(s):100.0%us,0.0%sy,0.0%ni,0.0%id,0.0%wa,0.0%hi,0.0%si,

0.0%st

Mem:1021532k total,497896k used,523636k free,80220k buffers

Swap:2064376k total,0k used,2064376k free,204004k cached

PID USER PR NI VIRT RES SHR S%CPU%MEM TIME+COMMAND

8333 root 20 0 105m 1856 1444 R 50.2 0.2 0:37.83 bash

8342 root 20 0 105m 1820 1424 R 49.9 0.2 0:32.43 bash


然后,向其中一个分组添加进程,并确认分组间(GroupA和GroupB)的CPU资源分配为各50%。

打开一个新的终端,向GroupB添加shell进程。同样,在这个shell上形成死循环,使CPU使用率达到100%。


echo$$>/cgroup/GroupB/tasks

while:;do true;done


这时使用top命令将显示下列结果。


top-03:54:07 up 1 day,19:08,4 users, load average:1.89,0.71,0.25

Tasks:115 total,4 running,111 sleeping,0 stopped,0 zombie

Cpu(s):100.0%us,0.0%sy,0.0%ni,0.0%id,0.0%wa,0.0%hi,0.0%si,0.0%st

Mem:1021532k total,497896k used,523636k free,80228k buffers

Swap:2064376k total,0k used,2064376k free,204008k cached

PID USER PR NI VIRT RES SHR S%CPU%MEM TIME+COMMAND

8333 root 20 0 105m 1856 1444 R 49.9 0.2 1:04.86 bash

8342 root 20 0 105m 1820 1424 R 24.9 0.2 0:57.64 bash

8354 root 20 0 105m 1852 1448 R 24.9 0.2 0:01.82 bash


可以看出GroupA和GroupB都为50%,并且GroupB中的两个shell进程也各占25%。再确认一下,是否即使再向GroupB添加其他进程,也不会对分配给GroupA的CPU时间产生影响。

同样,添加终端,将shell分配给GroupB,并形成死循环。


echo$$>/cgroup/GroupB/tasks

while:;do true;done


从top命令的结果可以看出,向GroupA分配了50%,剩下的50%被GroupB的3个进程均分。


top-03:57:11 up 1 day,19:11,5 users, load average:3.22,1.88,0.79

Tasks:116 total,5 running,111 sleeping,0 stopped,0 zombie

Cpu(s):99.7%us,0.3%sy,0.0%ni,0.0%id,0.0%wa,0.0%hi,0.0%si,0.0%st

Mem:1021532k total,498648k used,522884k free,80260k buffers

Swap:2064376k total,0k used,2064376k free,204008k cached

PID USER PR NI VIRT RES SHR S%CPU%MEM TIME+COMMAND

8333 root 20 0 105m 1856 1444 R 49.9 0.2 2:38.69 bash

8342 root 20 0 105m 1824 1424 R 16.9 0.2 1:36.27 bash

8354 root 20 0 105m 1856 1448 R 16.6 0.2 0:39.11 bash

8368 root 20 0 105m 1824 1424 R 16.6 0.2 0:14.23 bash


以上就是在分组间平分CPU资源的方法。

cpu. shares

下面介绍cpu.shares特殊文件。在启用CPU资源控制的Cgroup文件系统中,为Fair Group Scheduling准备了cpu.shares文件。


ls/cgroup/GroupA

cgroup.procs cpu.rt_runtime_us notify_on_release

cpu.rt_period_us cpu.shares tasks


在cpu.shares文件中,可以对进程调度程序所处理的进程组设置CPU时间分配的比重。通过修改这个值,就可以在分组间调整CPU时间的比例。默认值为1024。


cat/cgroup/GroupA/cpu.shares

1024


这里将GroupB的cpu.shares设置为GroupA的一半,即512。


echo 512>/cgroup/GroupB/cpu.shares


在CPU资源分配中,GroupA的比重变为1024,GroupB的比重变为512。因此,分配给GroupA的时间就是GroupB的2倍。使用top命令,确认分配给刚才启动的shell进程的CPU资源。


top-04:07:40 up 1 day,19:22,5 users, load average:4.00,3.73,2.34

Tasks:116 total,5 running,111 sleeping,0 stopped,0 zombie

Cpu(s):100.0%us,0.0%sy,0.0%ni,0.0%id,0.0%wa,0.0%hi,0.0%si,0.0%st

Mem:1021532k total,481024k used,540508k free,80348k buffers

Swap:2064376k total,0k used,2064376k free,204012k cached

PID USER PR NI VIRT RES SHR S%CPU%MEM TIME+COMMAND

8333 root 20 0 105m 1856 1444 R 66.5 0.2 7:54.18 bash

8342 root 20 0 105m 1824 1424 R 11.3 0.2 3:20.07 bash

8354 root 20 0 105m 1856 1448 R 11.0 0.2 2:22.90 bash

8368 root 20 0 105m 1824 1424 R 11.0 0.2 1:58.02 bash


可以发现,GroupA变成66%,GroupB变成33%,并且在GroupB中,3个shell进程分别占用11%。