云原生

cgroup从入门到实践

2021-11-23  本文已影响0人  負笈在线

为什么需要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执行一次全盘扫描的时间。

上一篇下一篇

猜你喜欢

热点阅读