一、Cgroups的创建
Cgroups创建主要包括有以下步骤组成:
1、创建并挂载一个hierarchy
2、在新建的hierarchy上的cgroup的根节点中扩展出两个子cgroup
3、通过subsystem来限制cgroup中进程的资源
4、Docker中的Cgroups
在介绍具体使创建步骤前,我首先介绍一下虚拟机环境:
二、创建并挂载一个hierarchy
创建并挂载一个hierarchy指令如下:
mkdir cgroups-test
mount -t cgroup -o none,name=cgroups-test cgroups-test ./cgroups-test
ll cgroups-test/
执行完成后出现下面界面表示创建挂载成功
三、在新建的hierarchy上的cgroup的根节点中扩展出两个子cgroup
在新建的hierarchy上的cgroup的根节点中扩展出两个子cgroup的具体指令如下:
cd cgroups-test/
mkdir cgroup-1 cgroup-2
ls
当出现下面步骤表示创建成功
可以看出,在一个cgroup的目录下创建文件夹时,系统Kernel会自动把该文件夹标记为这个cgroup的子cgroup,它们会继承父cgroup的属性。
几个文件功能说明:
- 1、tasks,标识该cgroup下面的进程ID。如果把一个进程ID写入了tasks文件,就是把该进程加入了这个cgroup中。
- 2、cgroup.procs 是树中当前cgroup中的进程组ID。如果是根节点,会包含所有的进程组ID。
- 3、cgroup.clone_children,默认值为0。如果设置为1,子cgroup会继承父cgroup的cpuset配置。
四、往一个cgroup中添加和移动进程
首先,查看一个进程目前所处的cgroup
具体指令如下所示:
echo $$
cat /proc/1019/cgroup
把进程移动到节点cgroup-1/中
具体指令如下所示:
cd cgroup-1/
cat tasks
cat cgroup.procs
之后在执行下面语句:
echo $$ >> tasks
cat /proc/1019/cgroup
cat cgroup.procs
cat tasks
当看到当前进程1019已经加入到cgroups-test:/cgroup-1中就完成了。但需要注意的是,到目前为止,上面创建的hierarchy并没有关联到任何的subsystem,所以还是没有办法通过上面的cgroup节点来限制一个进程的资源占用。
五、通过subsystem来限制cgroup中进程的资源
1、安装stress工具,具体指令如下:
yum install stress.x86_64
2、不使用Cgroups限制,启动一个占用200M内存的stress进程
stress --vm-bytes 200m --vm-keep -m 1
测试结果
top
3、使用Cgroups进行限制,仅允许使用100M内存
首先参照前面步骤,在memory 的根节点下新建一个cgroup节点test-limit-memory
cd /sys/fs/cgroup/memory
mkdir test-limit-memory
然后,设置该cgroup节点的最大内存占用为100M
cd test-limit-memory/
cat memory.limit_in_bytes
echo "100m" >> ./memory.limit_in_bytes
cat memory.limit_in_bytes
然后,把当前进程移动到这个cgroup节点test-limit-memory中
cat tasks
echo $$ >> tasks
cat tasks
最后,再次运行
stress --vm-bytes 200m --vm-keep -m 1
六、Docker中的Cgroups
docker run -itd -e is_leader=true -e node_name=aaa -m 128m
docker 会自动在memory hierarchy的目录下新建一个cgroup节点
pwd
cat memory.limit_in_bytes
cat memory.usage_in_bytes
其中:
1、 memory.limit_in_bytes 内存限制
2、memory.usage_in_bytes 该cgroup中的进程已经使用的memory