美文网首页云原生
cgroup从入门到实践

cgroup从入门到实践

作者: 負笈在线 | 来源:发表于2021-11-23 11:24 被阅读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执行一次全盘扫描的时间。

    相关文章

      网友评论

        本文标题:cgroup从入门到实践

        本文链接:https://www.haomeiwen.com/subject/svhwtrtx.html