用cgroups限制CPU资源的情况下在Linux
这一次说的是如何通过C组管理CPU资源。首先,控制进程的CPU使用,运行多个程序可能会消耗大量的机器资源,我们不希望一个程序占用了所有的资源,导致其他程序无法正常运行,甚至造成系统不能维持假死。此时,C组的使用控制过程中所占用的资源可以很好的。这是一个单一的CPU资源。
在C组,cpu.cfs_period_us和cpu.cfs_quota_us可以用来限制,该组中的所有过程都可以用单位时间内的CPU时间。这里的CFS是完全公平的scheduler.cpu.cfs_period_us简称为时间段,默认是100000,即100 milliseconds.cpu.cfs_quota_us是CPU时间,可以在这期间使用,默认的1,那是无限的。
运行CPU消耗程序
复制代码代码如下所示:
echo'while真实:通过| Python #
{ 1 } 1532
上面可以看到这个过程占CPU的100%。
复制代码代码如下所示:
PID用户Pr-Ni VIRT RES SHR的CPU时间为MEM +命令
1532根200 36841708 99.6 0.7 30.42 112m 0: Python
…
然后对过程做一些限制。
复制代码代码如下所示:
回声50000 > / / / C FS系统 / / / cpu.cfs_quota_us foo的CPU
回声1532
可以看出,改性,只需编写相应的文件,和过程中添加过程中C组只需写在它的任务文件PID。这里的cpu.cfs_quota_us设置为50000,与100000的cpu.cfs_period_us,或50%。上再次看到影响。
复制代码代码如下所示:
PID用户Pr-Ni VIRT RES SHR的CPU时间为MEM +命令
1532根200 36841708 50.2 0.7 0.31 112m R 5 Python
…
你可以看到,这个过程的CPU占用已经成功地限制在50%。在这里,测试虚拟机只有一个核心,在多核的情况下,这些值将是不同的。此外,cfs_quota_us也可以大于cfs_period_us,主要是多核的情况下,当N个芯,在对照组中能够使用最n倍的CPU时间。
这两个值在C组水平有限,以及资源的低水平不应超过上限水平。特别是,较低层的cpu.cfs_period_us值不能小于上层的cpu.cfs_quota_us值不能大于上层。
另一组cpu.rt_period_us和cpu.rt_runtime_us对应的实时过程的限制,就不能用在平时。
在CPU子系统,cpu.stat是在以前的way.nr_periods和nr_throttled做资源约束条件下的统计周期,通过和限制cycles.throttled_time控制组采用的总的CPU时间。
还有一个cpu.shares,它也被用来限制CPU的使用。但来自cpu.cfs_quota_us和cpu.cfs_period_us.cpu.shares完全不同,没有限制的过程绝对能用的CPU时间,但控制之间的groups.such的配额
复制代码代码如下所示:
/ /:1024 cpu.shares CPU
/ / / cpu.shares CPU一样:2048
所以在两组的过程是满负荷,在 / foo CPU可以 /占用两倍的过程。如果建设 / /酒吧cpu.shares foo也是1024,有一个满负荷运行的过程中,那 / / Foo / /酒吧1:2: foo是一是说CPU占用率是他们每个人都是满的。如果在其他控制组的过程是空闲的,一个组的过程可以完全充分的CPU。可以看出,在一般情况下,这种方法可以利用的资源公平的情况下更充分。
此外,你还可以限制CPU核心可以用一个过程的。CpuSet子系统是CPU核心和内存节点的处理过程可以使用,以及其他一些相关的配置,这部分的配置是numa.cpuset.cpus和cpuset.mems相关是用来限制CPU核心和内存节点可以通过使用过程。在这两个参数,CPU内核和内存节点表示身份,与分离。例如,0,1,训练也可以使用- 表示范围,如0-3.the两可组合使用。如;0-2,6,7。在加入过程中,cpuset.cpus和cpuset.mems必须设置在同一时间,而且必须是兼容的,否则将一件对的事的例子
复制代码代码如下所示:
#回声0 > /系统/ FS / / / C CpuSet foo / cpuset.cpus
#回声0 > /系统/ FS / / / C CpuSet foo / cpuset.mems
这样,在 / Foo的过程中只能使用CPU0和存储节点0.use
复制代码代码如下所示:
#猫 / / /触发状态| grep '_allowed_list
可以验证效果。
除了限制资源的使用,C组具有资源统计功能。它可用于云计算的会计。有一个cpuacct子系统,是专门用来做CPU资源statistics.cpuacct.stat统计在对照组中用户态和内核态的CPU使用率,单位是user_hz,那是,jiffies和CPU蜱,蜱每秒数可以由getconf clk_tck,得到的通常是100。你看,除以这个值可以被转换成一个二。
cpuacct.usage和cpuacct.usage_percpu是对照组的过程中所消耗的CPU时间,单位是秒。后者又分为CPU统计。
P.S. 2014-4-22
发现在SLES 11 SP2,SP3,相应的内核版本3.0.13和3.0.76,PID写入CPU子系统cgroup.procs,它将不能有效地工作,而且必须写入任务。在其他环境中,无论是高或低版本的内核版本已经发现。