linux中cpuset子系统,linux的qos机制 - cgroup篇 (1)

cgroups全称control groups,在RHEL6的2.6.32内核中已经包括了cgroup的patch。这里强烈建议安装RHEL6(CentOS6)来使用cgroups,如果没有的话,只能升级内核了 ( > 2.6.26版本)

下面的例子通过对cgroups的blkio, cpuset, memory三个子系统的实现来演示如何应用cgroups,我们这里不使用红帽子的libcgroup package提供的工具,通过该工具进行cgroup的操作详见这篇 http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/pdf/Resource_Management_Guide/Red_Hat_Enterprise_Linux-6-Resource_Management_Guide-en-US.pdf

1. cpu子系统

cpu.shares:假设cgroup A的tasks的cpu.shares值为1,cgroup B的tasks的cpu.shares值为2,则cgroup B的进程占用的cpu时间是cgroup A上进程的2倍。

cpu.rt_runtime_us

cpu.rt_period_us:这两个值建议不要设,让OS去调度占用的CPU时间的绝对值。

# mkdir /cgroup/cpu

# mount -t cgroup -o cpu none /cgroup/cpu

# mkdir /cgroup/cpu/tinker

# mkdir /cgroup/cpu/tailor

首先创建好cpu subsys的 cgroups,一共3个,可以从/proc/cgroups查询到。下面通过taskset -c 0指定程序的cpu affinity为cpu 0,启动2个进程

# taskset -c 0 yes low > /dev/null &

# taskset -c 0 yes high > /dev/null &

同时把两个pid分别echo $pid > tasks 文件中。修改cpu/tinker的cpu.shares为2048, cpu/tailor的cpu.shares为512,下面通过ps看他们的cpu占用率吧

# ps -C yes -opid,%cpu,psr,args

PID %CPU PSR COMMAND

19163 20.8   0 yes low

19164 79.4   0 yes high

tips:

1) 较低内核版本有个bug,详情见 http://lists.linux-foundation.org/pipermail/containers/2008-September/012948.html,推荐使用 > RHEL6.0作为服务器

2) 删除child cgroup请用rmdir,rm -rf是无效的

3) 可能是内核调度器的算法,设置了cpu.shares之后CPU利用率不会立刻就变为shares指定的那样,需要等待一段时间,基本上是个曲线的变化过程,之后就正确了。

2. cpuacct子系统

没啥好讲的,跳过

3. cpuset子系统

cpuset.cpus, cpuset.mems 表示不同cgroup的tasks可以使用的cpu核以及cpu对应的memory node (NUMA架构下),

cpuset.cpu_exclusive cpuset.mem_exclusive 表示是否共享该核以及对应的memory node (NUMA架构下),一般都为0表示可以共享

cpuset.sched_load_balance 表示是否对cpuset的所有CPU做负载平衡

cpuset.sched_relax_domain_level 表示调度策略,具体不赘述了

cpuset是和cpu affinity相关的,做实验如下:

# mount -t cgroup -o remount, cpuset none /cgroup/cpu

# mkdir tinker

# echo 0 > tinker/cpuset.cpus

启动一个进程,查看其cpu affinity

# yes hello > /dev/null &

[1] 19425

# taskset -p 19425

pid 19425's current affinity mask: 3

# taskset -c -p 19425

pid 19425's current affinity list: 0,1

# echo 19425 > tinker/tasks

# taskset -c -p 19425

pid 19425's current affinity list: 0

可以看出由于cpuset只有CPU 0,当把进程挂到cgroup tinker上之后,其CPU affinity也变为0

下面把cgroup tinker的cpu_exclusive设为1,表示独占该CPU

# echo 1 > tinker/cpuset.cpu_exclusive

# mkdir tailor

# echo 0 > tailor/cpuset.cpus

此时报错write error: Invalid argument,因为CPU 0已经被cgroup tinker独占,所以cgroup tailor只能使用CPU1

# echo 1 > tailor/cpuset.cpus

DONE!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cpuset子系统Linux内核用于管理和分配处理器资源的一个重要子系统。它允许系统管理员将不同的处理器核心分组为一个或多个独立的集合,然后将这些集合分配给不同的进程或进程组使用。 cpuset子系统的主要功能包括以下几方面: 1. 资源分组:通过cpuset子系统,可以将处理器核心分组为不同的集合。这样,可以将不同类型的工作负载分配到不同的处理器组,以便更好地进行资源管理和调度。 2. 资源限制:使用cpuset子系统,可以为每个处理器组设置资源限制,例如最大CPU使用率、最大内存使用量等。这样可以避免某个进程或进程组占用过多的系统资源而影响其他进程的正常运行。 3. 安全隔离:cpuset子系统可以实现不同进程或进程组之间的安全隔离。通过将不同进程组分配到不同的处理器组,可以确保它们彼此之间不会相互干扰,从而提高系统的可靠性和安全性。 4. 平衡负载:通过灵活地配置cpuset子系统,可以优化系统的负载平衡。可以根据实际需求将不同的进程或进程组分配到不同的处理器组,从而合理地分配处理器资源,提高系统的性能和吞吐量。 总之,cpuset子系统Linux内核用于管理和分配处理器资源的一个重要组成部分。通过合理地配置cpuset子系统,可以优化系统的资源利用率、提高系统的性能和稳定性,并实现不同进程之间的安全隔离。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值