0%

Cgroup限制内存与节点的删除

首先不限制内存,让我们常见一个进程

1
stress --vm-bytes 200m --vm-keep -m 1

如下图,机器 2G Mem
共占用 10%, 200mb

top 命令观察

现在利用 Cgroup 限制下内存

1
2
3
4
5
mkdir /sys/fs/cgroup/memory/testmem -p
cd /sys/fs/cgroup/memory/testmem
# 将当前bash pid 写入 tasks
echo $$ > tasks
echo 100m > memory.limit_in_bytes

然后在当前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

但由于当前 bashpid 已经写入了 testm/tasks

在删除这个文件夹之前需要将pid移到 包含 testm 的文件夹的 tasks 当中

1
2
cd /sys/fs/cgroup/memory/
echo $$ >> tasks

最后执行删除操作

1
rmdir ./testm

还有一个更方便的 cmd

他会帮你将子 grouptasks 当中的 pid 全部移动到 root 当中

先创建嵌套 cgroup

1
2
3
cd /sys/fs/cgroup/memory/
mkdir wwc/w1
echo $$ > wwc/w1/tasks

如果我们直接

1
rmdir wwc/

会直接报错

1
rmdir: failed to remove 'wwc': Device or resource busy

手动移除需要我们将嵌套 cgroup 中的 pid 全部移动到 memory/tasks

这时就可以借助

1
cgdelete -r memory:wwc