Sched_load_balance是cgroup中cpuset子系统提供的负载均衡功能。它用于控制当前cgroup以及下层的cgroup中任务的负载均衡性。要控制一个组的负载均衡,必须先将所有与本组共享cpu的其他组的负载均衡先关闭。
举例:12个核的系统,cpu0~cpu11,可以通过如下例子来了解sched_load_balance:
1 创建cpuset控制组
mkdir /cpuset
mount -t cgroup cpuset -o cpuset /cpuset
先挂载一个cpuset根组到/cpuset目录。接着创建子组:
mkdir /cpuset/d0/
echo 0 > /cpuset/d0/cpuset.mems
echo 8-11 > /cpuset/d0/cpuset.cpus
mkdir /cpuset/d0/d00/
echo 0 > /cpuset/d0/d00/cpuset.mems
echo 8-9 > /cpuset/d0/d00/cpuset.cpus
mkdir /cpuset/d0/d01/
echo 0 /cpuset/d0/d01/cpuset.mems
echo 8-11 > /cpuset/d0/d01/cpuset.cpus
这样我们就创建了4个cpuset控制组:/cpuset (cpuset.cpus=0-11),/cpuset/d0 (cpuset.cpus=8-11),/cpuset/d0/d00 (cpuset.cpus=8-9) 和 /cpuset/d0/d01 (cpuset.cpus=8-11)。
默认情况下所有cpuset控制组的cpuset.sched_load_balance功能都使能,其值为1。
2 关闭子组负载均衡
我们的目的就是要通过cpuset.sched_load_balance来控制任务的负载均衡,这里我们以/cpuset/d0/d00这个子组为目标,控制这个组的上面任务的负载均衡。
我们知道默认情况下cpuset控制组的cpuset.sched_load_balance处于使能状态,因而我们上面创建的4个组都使能了自己组的负载均衡。
而/cpuset,/cpuset/d0以及 /cpuset/d0/d01的cpuset.cpus分别是cpu0-11,cpu8-11,和cpu8-11,这几个cpu集合都包含了/cpuset/d0/d00的cpu集合 cpu8-9。
因而,要关闭/cpuset/d0/d00组中cpu8,cpu9的负载均衡,先要将cpu0-11,cpu8-11这几个cpu集合的负载均衡关掉。在咱们的例子中就是需要:
echo 0 > /cpuset/cpuset.sched_load_balance
echo 0 > /cpuset/d0/cpuset.sched_load_balance
echo 0 > /cpuset/d0/d01/cpuset.sched_load_balance
最后,我们启动4个死循环任务,假设其pid分别是401,402,403,404; 并将他们放到/cpuset/d0/d00组:
echo 401 > /cpuset/d0/d00/tasks
echo 402 > /cpuset/d0/d00/tasks
echo 403 > /cpuset/d0/d00/tasks
echo 404 > /cpuset/d0/d00/tasks
然后执行top -d 1 命令,你看到了什么? 可以看到这四个死循环任务没有负载均衡。
还可以反向验证,分别打开其他三个组的负载均衡,再执行top -d 1 看看会发生什么?
还可以将/cpuset/d0/d01/cpuset.cpus改为10-11,然后再来top验证一下,看看又会发生什么?
这些就留给小伙伴们自己去实验了。