FAIRYFAR-INTERNAL
 
  FAIRYFAR-INTERNAL  |  SITEMAP  |  ABOUT-ME  |  HOME  
cgroup限制内存与节点的删除

转自:https://www.chaochaogege.com/2019/09/11/6/

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

snippet.b
stress --vm-bytes 200m --vm-keep -m 1

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

用 top 命令观察

现在利用 Cgroup 限制下内存

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中启动

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

另开一个shell, top 观察

可以看到,第二个进程的内存被限制到了 100m

删除 Cgroup

由于每个 Cgroup 都是完整的文件夹,所以我当时的方法是直接递归删除文件

rm -rf ./testm

结果报了成堆的如下错误。

rm: cannot remove 'testm/cgroup.procs': Operation not permitted

后来查了下

http://blog.tinola.com/?e=21

我们无法删除这些文件,但可以删除文件夹

rmdir ./testm

但由于当前 bash 的 pid 已经写入了 testm/tasks

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

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

最后执行删除操作

rmdir ./testm

还有一个更方便的 cmd

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

先创建嵌套 cgroup

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

如果我们直接

rmdir wwc/

会直接报错

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

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

这时就可以借助

cgdelete -r memory:wwc


打赏作者以资鼓励:
移动端扫码阅读: