同樣,cgroup也可以對memory資源進行限制。下面以一個例子來驗證cgroup對內存限制的使用。
1.編寫程序,循環分配600M內存。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define CHUNK_SIZE 1024 * 1024 * 100
int 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 MB
malloc memory 200 MB
malloc memory 300 MB
malloc memory 400 MB
malloc memory 500 MB
malloc memory 600 MB
[root@localhost ~]# top -p 2265
PID 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_bytes
9223372036854771712
# 設置最大內存大小爲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 MB
malloc memory 200 MB
Killed
通過設置memory.oom_disable的值來設置內存超出設定值時是操作系統kill進程還是休眠進程。
# mem內存超過200M時進程會休眠
echo 1 > /sys/fs/cgroup/memory/memory-test/memory.oom_control