cgroup从入门到实践
为什么需要cgroup?
Linux系统中安装了杀毒软件ESET或者ClamAV,杀毒时占用系统资源过高,影响系统承载业务运行,怎么办?
单个虚拟机进程或者docker进程使用过高的资源,怎么办?
单个Java进行占用系统过多的内存的资源,怎么办?
...
cgroup就是能够控制并解决上述问题的工具;cgroup在linux内核实现、用于控制linux系统资源。
cgroup ,控制组,它提供了一套机制用于控制一组特定进程对资源的使用。cgroup绑定一个进程集合到一个或多个子系统上。subsystem,子系统,一个通过cgroup提供的工具和接口来管理进程集合的模块。一个子系统就是一个典型的“资源控制器”,用来调度资源或者控制资源使用的上限。其实每种资源就是一个子系统。子系统可以是以进程为单位的任何东西,比如虚拟化子系统、内存子系统。 hierarchy,层级树,多个cgroup的集合,这些集合构成的树叫hierarchy。可以认为这是一个资源树,附着在这上面的进程可以使用的资源上限必须受树上节点(cgroup)的控制。hierarchy上的层次关系通过cgroupfs虚拟文件系统显示。系统允许多个hierarchy同时存在,每个hierachy包含系统中的部分或者全部进程集合。 cgroupfs是用户管理操纵cgroup的主要接口:通过在cgroupfs文件系统中创建目录,实现cgroup的创建;通过向目录下的属性文件写入内容,设置cgroup对资源的控制;向task属性文件写入进程ID,可以将进程绑定到某个cgroup,以此达到控制进程资源使用的目的;也可以列出cgroup包含的进程pid。这些操作影响的是sysfs关联的hierarchy,对其它hierarchy没有影响。对于cgroup,其本身的作用只是任务跟踪。但其它系统(比如cpusets,cpuacct),可以利用cgroup的这个功能实现一些新的属性,比如统计或者控制一个cgroup中进程可以访问的资源。举个例子,cpusets子系统可以将进程绑定到特定的cpu和内存节点上。
cgroup安装(CentOS 7为例)
1.YUM安装
# yum -y install libcgroup libcgroup-tools
2.cgconfig启动
# systemctl start cgconfig
3.设置cgconfig自动启动
# systemctl enable cgconfig
4.子系统检查
# ll /sys/fs/cgroup
total 0
drwxr-xr-x 2 root root 0 Nov 12 17:56 blkio
lrwxrwxrwx 1 root root 11 Nov 12 17:56 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Nov 12 17:56 cpuacct -> cpu,cpuacct
drwxr-xr-x 2 root root 0 Nov 12 17:56 cpu,cpuacct
drwxr-xr-x 2 root root 0 Nov 12 17:56 cpuset
drwxr-xr-x 3 root root 0 Nov 12 23:56 devices
drwxr-xr-x 2 root root 0 Nov 12 17:56 freezer
drwxr-xr-x 2 root root 0 Nov 12 17:56 hugetlb
drwxr-xr-x 2 root root 0 Nov 12 17:56 memory
lrwxrwxrwx 1 root root 16 Nov 12 17:56 net_cls -> net_cls,net_prio
drwxr-xr-x 2 root root 0 Nov 12 17:56 net_cls,net_prio
lrwxrwxrwx 1 root root 16 Nov 12 17:56 net_prio -> net_cls,net_prio
drwxr-xr-x 2 root root 0 Nov 12 17:56 perf_event
drwxr-xr-x 2 root root 0 Nov 12 17:56 pids
drwxr-xr-x 4 root root 0 Nov 12 17:56 systemd
各子系统介绍及说明
[root@localhost ~]# lssubsys
cpuset # cpuset 为 cgroup 任务分配各个 CPU 和内存节点
cpu,cpuacct # cpu 调度 CPU 访问(例如,根据相对份额,或针对实时进程),报告CPU使用率
memory # 报告或限制内存使用
devices # 授予或拒绝对设备的访问权限
freezer # 挂起或恢复任务
net_cls,net_prio # 提供对网络带宽的访问限制,比如对发送带宽和接收带宽进程限制。
blkio # 报告或控制块设备的 I/O 带宽
perf_event # 可以识别任务的cgroup,并用于性能分析(启用使用perf工具监视cgroup;)
hugetlb # 允许使用大容量的虚拟内存页,并在这些页上强制执行资源限制。
pids # 限制进程数
使用:创建一个控制组(CPU使用率限制到50%),并对脚本test.sh适用(即限制test.sh CPU使用率不超过50%)。
<1>创建控制组
1.确认当前状况
# lssubsys
cpuset
cpu,cpuacct
memory
devices
freezer
net_cls,net_prio
blkio
perf_event
hugetlb
pids
2.CPU子系统的默认设置确认
# cgget -g cpu /
/:
cpu.rt_period_us: 1000000
cpu.rt_runtime_us: 950000
cpu.stat: nr_periods 0
nr_throttled 0
throttled_time 0
cpu.cfs_period_us: 100000
cpu.cfs_quota_us: -1
cpu.shares: 1024
3.创建控制组:CPU使用率限制到50%
# cat /etc/cgconfig.d/cpu_quota-50.conf
group cpu_quota-50 {
cpu {
cpu.cfs_quota_us="50000";
}
}
4.重启cgconfig
# systemctl restart cgconfig
5.确认控制组设定
# cgget -g cpu /cpu_quota-50
/cpu_quota-50:
cpu.rt_period_us: 1000000
cpu.rt_runtime_us: 0
cpu.stat: nr_periods 0
nr_throttled 0
throttled_time 0
cpu.cfs_period_us: 100000
cpu.cfs_quota_us: 50000
cpu.shares: 1024
<2>对任务适应控制组规则
Cgred 是一个守护进程,它可根据在 /etc/cgrules.conf 文件中设定的参数将任务移动到 cgroup 中。
1.启动cgred
# systemctl start cgred
2.设置cgred自动启动
# systemctl enable cgred
3.设置
# cp -p /etc/cgrules.conf /etc/cgrules.conf.bak
# vi /etc/cgrules.conf
追加以下内容
*:test.sh cpu /cpu_quota-50
参考例子
# [user] [subsystem] [control group]
cent cpu /cpu_quota-70
# for specific comman/script, set [user:command]
# possible to use wild card (* = all)
# below means [test.sh] by all users set in [cpu_quota-70] group
*:test.sh cpu /cpu_quota-70
# for specifying group, set [@group]
@cent cpu /cpu_quota-70
4.重启cgroup
# systemctl restart cgred
<3>确认
设置前任务执行时间VS设置后任务执行时间;比如对比杀毒软件ESET执行一次全盘扫描的时间。