手把手教你使用cgroup配置,十分钟就会
- 什么是cgroup
- cgroup中的参数
- 概念及原理
- 以 memory为例看下如何配置
- 配置内存限制
- 写一个内存申请脚本
- 执行脚本测试
- 结束语
什么是cgroup
cgroups 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对 cpu,内存等资源实现精细化的控制,目前越来越火的轻量级容器 Docker 就使用了 cgroups 提供的资源限制能力来完成cpu,内存等部分的资源控制。
cgroup中的参数
概念及原理
cgroups 的全称是control groups,cgroups为每种可以控制的资源定义了一个子系统。典型的子系统介绍如下:
cpu 子系统,主要限制进程的 cpu 使用率。
cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
memory 子系统,可以限制进程的 memory 使用量。
blkio 子系统,可以限制进程的块设备 io。
devices 子系统,可以控制进程能够访问某些设备。
net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace。
以 memory为例看下如何配置
先在memory下添加一个组,这个组是方便后续的进程归属,cgroup的配置以这个组为单位
sudo mkdir /sys/fs/cgroup/memory/mytainer
如上我们创建了一个 mytainer的cgroup memory的组
配置内存限制
[admin@v43b09265 /home/admin]
$sudo bash -c ‘echo -n “50M” > /sys/fs/cgroup/memory/mytainer/memory.limit_in_bytes’
[admin@v43b09265 /home/admin]
$sudo bash -c ‘echo -n “50M” > /sys/fs/cgroup/memory/mytainer/memory.memsw.limit_in_bytes’
通过上述的配置,把进程的内存限制在 50M
这里有点要注意: 如果直接 echo "50M " 报 permission deny 如下
那么就采用 sudo bash -c 的方式去搞
写一个内存申请脚本
import sys
import time
def print_help():
print 'Usage: '
print ' python mem.py 100MB'
print ' python mem.py 1GB'
if __name__ == "__main__":
print("alloc 1M memory...")
s = ' ' * 1024 * 1024 // 这里先申请1M 内存
time.sleep(10)
print("sleep 10s ...")
s = s * 100. // 再申请 100M内存
print("alloc 100M memory...")
time.sleep(30)
print("sleep 30s ...")
该脚本是个python 脚本,命名为mem.py
执行脚本测试
如上图所示 , 我们启动 脚本的同时 把它添加到 我们cgroup的memory的组里面
会发现脚本执行 到100M内存的时候被kill掉了
结束语
这里也可以先把python的脚步单独启动, 然后把 其 pid 添加到 cgroup对应的tasks 里面, 然后也是一样的。
但是如果脚本的内存已经是申请结束了,然后再把其 pid 加到task 里面那么是无效果的,cgroup 不会把脚本杀死
针对 cpu等设置也是同样的思路。 求人不如求己。共勉!