linux cgroups详细介绍

2019-10-09 16:25:08于海丽

#include<stdio.h>#include<stdlib.h>#include<string.h>#define CHUNK_SIZE 1024 * 1024 * 100void main(){ char *p; int i; for(i = 0; i < 5; i ++) { p = malloc(sizeof(char) * CHUNK_SIZE); if(p == NULL) { printf("fail to malloc!"); return ; } // memset() 函数用来将指定内存的前 n 个字节设置为特定的值 memset(p, 0, CHUNK_SIZE); printf("malloc memory %d MBn", (i + 1) * 100); }}

把上面的代码保存为 mem.c 文件,然后编译:

$ gcc mem.c -o mem

执行生成的 mem 程序:

$ ./mem

此时一切顺利,然后加上刚才的约束试试:

$ cgexec -g memory:nick_memory ./mem

由于内存不足且禁止使用 swap,所以被限制资源的进程在申请内存时被强制杀死了。

下面再使用 stress 程序测试一个类似的场景(通过 stress 程序申请 500M 的内存):

$ sudo cgexec -g memory:nick_memory stress --vm 1 --vm-bytes 500000000 --vm-keep --verbose

stress 程序能够提供比较详细的信息,进程被杀掉的方式是收到了 SIGKILL(signal 9) 信号。

实际应用中往往要同时限制多种的资源,比如既限制 CPU 资源又限制内存资源。使用 cgexec 实现这样的用例其实很简单,直接指定多个 -g 选项就可以了:

$ cgexec -g cpu:nick_cpu -g memory:nick_memory ./cpumem

总结

cgroups 是 linux 内核提供的功能,由于牵涉的概念比较多,所以不太容易理解。本文试图在介绍概念性内容的同时,用最简单的 demo 演示 cgroups 的用法。希望直观的 demo 能够帮助大家理解 cgroups。