本文共 1868 字,大约阅读时间需要 6 分钟。
同样,cgroup也可以对memory资源进行限制。下面以一个例子来验证cgroup对内存限制的使用。
1.编写程序,循环分配600M内存。
#include#include #include #define CHUNK_SIZE 1024 * 1024 * 100int main(){ char *p; int i; for(i = 0; i < 6; i ++) { p = malloc(CHUNK_SIZE); if(p == NULL) { printf("malloc error!"); return 0; } memset(p, 0, CHUNK_SIZE); printf("malloc memory %d MB\n", (i + 1) * 100); sleep(10); } while(1) { sleep(1); } return 0;}
2.编译,运行程序
[root@localhost ~]# gcc mem.c -o mem[root@localhost ~]# ./mem malloc memory 100 MBmalloc memory 200 MBmalloc memory 300 MBmalloc memory 400 MBmalloc memory 500 MBmalloc memory 600 MB[root@localhost ~]# top -p 2265PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2265 root 20 0 618640 614744 388 S 0.0 15.9 0:00.47 mem
可以看出程序占用约600M内存。
3.添加cgroup限制
[root@localhost ~]# mkdir -p /sys/fs/cgroup/memory/memory-test[root@localhost ~]# cat /sys/fs/cgroup/memory/memory-test/memory.limit_in_bytes9223372036854771712# 设置最大内存大小为200M[root@localhost ~]# echo 209715200 > /sys/fs/cgroup/memory/memory-test/memory.limit_in_bytes [root@localhost ~]# cat /sys/fs/cgroup/memory/memory-test/memory.limit_in_bytes 209715200#为了避免受swap空间的影响,设置swappiness为0来禁止当前cgroup使用swap[root@localhost ~]# echo 0 > /sys/fs/cgroup/memory/memory-test/memory.swappiness
4.重新启动程序,并将程序加入cgroup
[root@localhost ~]# ./mem #另一个shell执行[root@localhost ~]# echo `ps -ef | grep mem | grep -v grep | awk '{print $2}'` > /sys/fs/cgroup/memory/memory-test/tasks
过了一会可以看到程序被kill了。
[root@localhost ~]# ./mem malloc memory 100 MBmalloc memory 200 MBKilled
通过设置memory.oom_disable的值来设置内存超出设定值时是操作系统kill进程还是休眠进程。
# mem内存超过200M时进程会休眠echo 1 > /sys/fs/cgroup/memory/memory-test/memory.oom_control
转载地址:http://fecmb.baihongyu.com/