Chinaunix首页 | 论坛 | 博客
  • 博客访问: 771194
  • 博文数量: 247
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 501
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-12 21:53
个人简介

系统未建立

文章分类

全部博文(247)

文章存档

2021年(1)

2020年(3)

2019年(5)

2018年(3)

2017年(44)

2016年(75)

2015年(52)

2014年(63)

2013年(1)

我的朋友

分类: LINUX

2014-12-30 14:02:59

问题:
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中。
阅读(1984) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~