linux c 利用时间限制程序的使用,Linux中使用cgroup来限制资源使用

CGroup 相关概念

任务(task):任务就是系统的一个进程;

控制群(control group):控制群是一组按照某种标准划分的进程。Cgroup的资源控制都是以控制群为单位实现。一个进程可以加入到某个控制群,也可以迁移到另一个控制群。

层级(hierarchy):控制群可以组织成 hierarchical 的树形式。控制群树上的子节点控制群是父节点控制群的孩子,继承父控制族群的特定的属性;

子系统(subsystem):子系统是一个资源控制器,比如 cpu 子系统就是控制 cpu 时间分配的控制器。子系统必须附加(attach)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制群都受到这个子系统的控制。

相互关系

在系统中创建新层级时,系统中的所有任务都是那个层级的默认 cgroup(称为root cgroup。

一个子系统最多只能附加到一个层级;

一个层级可以附加多个子系统;

一个任务可以是多个 cgroup 的成员,但是这些 cgroup 必须在不同的层级;

系统中的进程的子进程,自动成为其父进程所在 cgroup 的成员。可根据需要将该子任务移动到不同的 cgroup 中,开始会继承其父任务的 cgroup。

CGroup 层级图如下图:

0818b9ca8b590ca3270a3433284dd417.png

当前系统准备了9个子系统,以下是每个子系统的详细说明:

blkio设置限制每个块设备的输入输出控制。

cpu 使用调度程序为cgroup任务提供cpu的访问。

cpuacct 产生cgroup任务的cpu资源报告。

cpuset 为cgroup任务分配单独的cpu和内存。

devices 允许或拒绝cgroup任务对设备的访问。

freezer 暂停和恢复cgroup任务。

memory 设置每个cgroup的内存限制以及产生内存资源报告。

net_cls 标记每个网络包以。

ns 名称空间子系统。

安装使用

需要安装libcap-devel libcgroup

启用cgroup命令:service cgconfig restart

查看已存在子系统:lssubsys –am

清除所有挂载点内部文件:cgclear #,相当于service cgconfig stop

默认配置文件/etc/cgconfig.conf:主要包含了两个主要类型:mount和group。mount是指创建以及挂载哪些层次为虚拟文件系统,并附上子系统的层次结构。

Cgroup默认挂载点(CentOS):/cgroup

常用命令

cgclassify –将运行的任务移动到一个或者多个cgroup,例如:cgclassify -g cpu:yy [pid]

cgclear --删除层级中的所有cgroup。

cgconfigparser --解析cgconfig.conf文件和并挂载层级。

cgcreate -- cgcreate在层级中创建新cgroup。

cgdelete -- cgdelete命令删除指定的cgroup。

cgexec – 这个命令是cgroup启动的cgexec命令在指定的cgroup中运行任务。例如:cgexec -g "blkio:foo" dd if=/dev/zero of=/dev/null &。如果不使用那就手动把进程号写入到tasks中吧。

cgget -- cgget命令查看cgroup组里面设置的资源的限制。

cgrulesengd --在 cgroup 中发布任务。

cgset -- cgset 命令为 cgroup 设定参数。路径相对于根的/cgroup,如果想设置根的参数使用gset命令。

lscgroup --命令列出层级中的 cgroup。

lssubsys --命令列出包含指定子系统的层级,使用-am参数可以看到未挂载的所有子系统。。

CPU限制

cfs_quota_us和cfs_period_us

在多核情况下cfs_quota_us是可以大于 cfs_period_us 的。有 n 个核时,一个控制组中的进程自然最多就能用到 n 倍的 cpu 时间

cpu.rt_period_us和cpu.rt_runtime_us

cpu.rt_period_us、cpu.rt_runtime_us 对应的是实时进程的限制。

cpu.stat

cpu.stat是资源限制的统计。nr_periods、nr_throttled 就是总共经过的周期,和其中受限制的周期。throttled_time 就是总共被控制组掐掉的 cpu 使用时间。

cpu.shares

cpu.shares也是限制 cpu 使用的。与 cpu.cfs_quota_us、cpu.cfs_period_us 有挺大区别。cpu.shares 不是限制绝对的 cpu 时间,而是控制各个组之间的配额。

cpuset

cpuset 子系统就是处理进程可以使用的 cpu 核心和内存节点,以及其他一些相关配置。这部分的很多配置都和 NUMA 有关。其中 cpuset.cpus、cpuset.mems 就是用来限制进程可以使用的 cpu 核心和内存节点的。

cpuacct.stat

cpuacct 子系统有资源统计的功能,用来做 cpu 资源统计。cpuacct.stat 统计了该控制组中进程用户态和内核态的 cpu 使用量,单位是 jiffies、cpu 滴答数。内核时钟频率可以用 getconf CLK_TCK 来获取,通常是 100,将将看到的值除以这个值就可以换算成秒。

内存限制

如果内存使用超过了cgroups的限制,会触发out of memory,导致进程被kill掉。

可以通过配置关掉cgroups oom kill进程,通过memory.oom_control来实现(oom_kill_disable 1),但是尽管进程不会被直接杀死,但进程也进入了休眠状态,无法继续执行,仍让无法服务

IO限制

echo '5:0 1048576' > /cgroup/blkio/yy/blkio.throttle.read_bps_device #其中5:0对应主设备号和副设备号,可以通过ls -l /dev/sda查看

数字1048576表示多少字节。

blkio.throttle.read_bps_device

blkio.throttle.read_iops_device

blkio.throttle.write_bps_device

blkio.throttle.write_iops_device

blkio.weight

blkio.weight_device

以上用来控制进程磁盘 io 的。带“throttle”的是节流阀,将流量限制在绝对值下,而“weight”就是分配 io 的权重。类似和 cpu 子系统的 quota 和 shares,一种是绝对限制,另一种是相对限制。blkio.weight_device 是分设备的。写入时,前面再加上设备号即可。

常见问题

cgroup change of group failed

答:进程无法切换到指定的cgroup,一般都是配置的参数有问题。例如在单核情况下cfs_quota_us是不能大于 cfs_period_us。下层的资源不能超过上层。具体的说,就是下层的 cpu.cfs_period_us 值不能小于上层的值,cpu.cfs_quota_us 值不能大于上层的值。

此外如何使用了CPUSET,则必须设置cpuset.cpus 和 cpuset.mems。

Some subsystems have mandatory parameters that must be set before you can move a task into a cgroup which uses any of those subsystems. For example, before you move a task into a cgroup which uses the cpuset subsystem, the cpuset.cpus and cpuset.mems parameters must be defined for that cgroup.

cgroups can't be listed: Cgroup is not mounted

答:cgroup文件系统未挂载,cgclear会导致文件系统卸载。重新执行

#mount -t cgroup cgroup /sys/fs/cgroup

参考链接

http://www.jianshu.com/p/dc3140699e79

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值