问题:
cgroups组内启动的进程,在进程诞生时就受cgroups组约束;而迁移过来的进程则存在统计控制不完全的问题,如内存。
默认情况下,迁移进程到cgroups组内时,其在cgroups组外申请使用的内存是不迁移到cgroups组内的。
已知的2种cgroups工具:
1.cgclassify,这个命令是在进程起来后将pid加入task,调整资源控制参数,会不生效;
2.cgexec,这个到是可以生效,但是这个就相当于进程启动前就把握了主动权;
解决来自于:
在内存控制的时候,当一个进程起来时,默认会放到memory子系统的根目录中的tasks文件中,对于将一个task从根目录group中迁移到另外一个自己定义的group时,默认的情况是,其charge并没有顺带一起带走。此时,就需要把目标group中的memory.move_charge_at_immigrate置为1。从而开启内存控制子系统的task迁移特性。
经过实验发现:把目标group中的memory.move_charge_at_immigrate置为1,如果进程迁移前使用的内存>目标cgroups限定内存大小,会导致迁移失败。
?# echo 2691 > testM/cgroup.procs
bash: echo: write error: Cannot allocate memory
?# echo 2691 > testM/tasks
bash: echo: write error: Cannot allocate memory
另外,对于多线程的进程,只讲进程的组id加入cpu子系统的task,存在不能监控进程内所有线程的问题。
解决办法: 将已经启动的进程的PID放入cgroup.procs中,cgroup会自动将其所有线程放入tasks中。
阅读(2058) | 评论(0) | 转发(0) |