首先不限制内存,让我们常见一个进程
1 | stress --vm-bytes 200m --vm-keep -m 1 |
如下图,机器 2G Mem
共占用 10%
, 200mb
用 top
命令观察
现在利用 Cgroup
限制下内存
1 | mkdir /sys/fs/cgroup/memory/testmem -p |
然后在当前bash中启动
1 | stress --vm-bytes 200m --vm-keep -m 1 |
另开一个shell, top
观察
可以看到,第二个进程的内存被限制到了 100m
删除 Cgroup
由于每个 Cgroup 都是完整的文件夹,所以我当时的方法是直接递归删除文件
1 | rm -rf ./testm |
结果报了成堆的如下错误。
1 | rm: cannot remove 'testm/cgroup.procs': Operation not permitted |
后来查了下
http://blog.tinola.com/?e=21
我们无法删除这些文件,但可以删除文件夹
1 | rmdir ./testm |
但由于当前 bash
的 pid
已经写入了 testm/tasks
在删除这个文件夹之前需要将pid移到 包含 testm 的文件夹的 tasks
当中
1 | cd /sys/fs/cgroup/memory/ |
最后执行删除操作
1 | rmdir ./testm |
还有一个更方便的 cmd
他会帮你将子 group
下 tasks
当中的 pid
全部移动到 root
当中
先创建嵌套 cgroup
1 | cd /sys/fs/cgroup/memory/ |
如果我们直接
1 | rmdir wwc/ |
会直接报错
1 | rmdir: failed to remove 'wwc': Device or resource busy |
手动移除需要我们将嵌套 cgroup
中的 pid
全部移动到 memory/tasks
这时就可以借助
1 | cgdelete -r memory:wwc |