你将学到什么
- 什么是cgroup
- 如何使用cgroup
Cgroup简介
CGroup是Control Groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的硬件资源的机制。
Cgroup子系统
具体的资源管理功能被称为CGroup子系统或控制器,比如CPU 时间、系统内存和网络带宽等。Red Hat Enterprise Linux 6提供9个cgroup子系统:
子系统 | 说明 |
---|---|
blkio | 为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等) |
cpu | 使用调度程序提供对CPU的cgroup任务访问 |
cpuacct | 自动生成cgroup中任务所使用的CPU报告 |
cpuset | 为cgroup中的任务分配独立CPU(在多核系统)和内存节点 |
devices | 允许或者拒绝cgroup中的任务访问设备 |
freezer | 挂起或者恢复cgroup中的任务 |
memory | 设定cgroup中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告 |
net_cls | 使用等级识别符(classid)标记网络数据包,可允许Linux流量控制程序(tc)识别从具体cgroup中生成的数据包 |
子系统、层级、控制组群和任务的关系
- 任何单一子系统(比如 cpu)最多可附加到一个层级中
- 单一层级可附加一个或者多个子系统。
- 每次在系统中创建新层级时,该系统中的所有任务都是那个层级的默认 cgroup(我们称之为 root cgroup)的初始成员。对于您创建的任何单一层级,该系统中的每个任务都可以是那个层级中唯一一个 cgroup 的成员。单一任务可以是在多个 cgroup 中,只要每个 cgroup 都在不同的层级中即可。只要某个任务成为同一层级中第二个 cgroup 的成员,就会将其从那个层级的第一个 cgroup 中删除。一个任务永远不会同时位于同一层级的不同 cgroup 中。
- 该系统中的任意进程(任务)都将自己分支创建子进程(任务)。该子任务自动成为其父进程所在 cgroup 的成员。然后可根据需要将该子任务移动到不同的 cgroup 中,但开始时它总是继承其父任务的 cgroup(进程术语中称其为“环境”)。
管理Cgroup管理
使用cgconfig管理层级和cgroup
cgconfig.conf配置文件
配置文件结构如下,其中perm选项为可选:
mount {
<controller> = <path>;
…
}
group <name> {
[<permissions>]
perm {
task {
uid = <task user>;
gid = <task group>;
}
admin {
uid = <admin name>;
gid = <admin group>;
}
} <controller> {
<param name> = <param value>;
…
}
…
}
创建层级并附加子系统
### 修改cgconfig.conf配置文件修改mount字段,并添加如下条目
subsystem = /cgroup/hierarchy;
### 例如
mount {
cpuset = /cgroup/cpu_and_mem;
}
### 查询当前系统的Cgroup子系统信息
# lssubsys -am
cpuset /sys/fs/cgroup/cpuset
cpu,cpuacct /sys/fs/cgroup/cpu,cpuacct
blkio /sys/fs/cgroup/blkio
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
net_cls,net_prio /sys/fs/cgroup/net_cls,net_prio
perf_event /sys/fs/cgroup/perf_event
hugetlb /sys/fs/cgroup/hugetlb
pids /sys/fs/cgroup/pids
删除子系统
### 修改cgconfig.conf配置文件修改mount字段,将对应的子系统条目从现有层级中取消层级或者将其移动到不同的层级中
创建控制组群
### 使用cgcreate命令创建cgroup
# cgcreate -t uid:gid -a uid:gid -g subsystems:path
参数 | 说明 |
---|---|
-t | 可选参数,指定用户和组群以便让这个cgroup拥有 tasks伪文件,这个用户可在该cgroup中添加任务 |
-a | 可选参数,指定用户和组群以便这个cgroup拥有 tasks外的所有伪文件,这个用户可修改这个cgroup中的任务对系统资源的访问 |
-g | 指定在其中创建cgroup的层级,格式为与那些层级关联的用逗号分开的subsystems列表。如果这个列表中的子系统在不同的层级中,则要在每个层级中都创建该组群。层级列表后是一个冒号,然后是与该层级有关的子组群path。不要在该path中包含层级挂载点 |
删除控制组群
### 使用cgdelete命令删除cgroup
# cgdelete subsystems:path
设定子系统参数
### 使用cgset命令设定子系统参数
# cgset -r parameter=value path_to_cgroup
参数 | 说明 |
---|---|
parameter | 要设定的参数,该参数与给定cgroup的目录中的文件对应。 |
value | 参数设定的值 |
path_to_cgroup | 相对该层级root的cgroup路径,例如:设定root组群的参数,存在/cgroup/cpuacct/文件,则执行cgset -r cpuacct.usage=0 / |
移动进程到控制组群
# cgclassify -g subsystems:path_to_cgroup pidlist
参数 | 说明 |
---|---|
subsystems | 用逗号分开的子系统列表,或者 * 启动与所有可用子系统关联的层级中的进程 |
path_to_cgroup | 到其层级中的cgroup的路径 |
pidlist | 用空格分开的进程识别符(PID)列表 |
获取Cgroup信息
查询进程所属Cgroup
# ps -O cgroup
# cat /proc/PID/cgroup
查询子系统
# cat /proc/cgroups
# lssubsys -m subsystems
查询层级
# tree /cgroup/
查询控制组群
# lscgroup
# lscgroup controller:path
显示控制组群的参数
# cgget -r parameter list_of_cgroups
### 查询参数名称
# cgget -g cpuset /
子系统和可调用参数
参见RedHat官方文档