zoukankan      html  css  js  c++  java
  • Cgroup(一)简介

    一、Linux CGroup
    Cgroups是control groups的缩写,是Linux内核提供的一种可以限制,记录,隔离进程组(process groups)所使用物理资源的机制
     
    二、作用
    1、Resource limitation: 限制资源使用,比如内存使用上限以及文件系统的缓存限制
    2、Prioritization: 优先级控制,比如:CPU利用和磁盘IO吞吐
    3、Accounting: 一些审计或一些统计,主要目的是为了计费
    4、Control: 挂起进程,恢复执行进程
     
    三、基本概念
    Cgroups主要由task,cgroup,subsystem及hierarchy构成
    1、task:在Cgroups中,task就是系统的一个进程
     
    2、cgroup
    Cgroups中的资源控制都以cgroup为单位实现的。
    cgroup表示按照某种资源控制标准划分而成的任务组,包含一个或多个子系统。
    一个任务可以加入某个cgroup,也可以从某个cgroup迁移到另外一个cgroup
     
    3、subsystem
    Cgroups中的subsystem就是一个资源调度控制器(Resource Controller)。
    比如CPU子系统可以控制CPU时间分配,内存子系统可以限制cgroup内存使用量
     
    4、hierarchy
    hierarchy由一系列cgroup以一个树状结构排列而成,每个hierarchy通过绑定对应的subsystem进行资源调度。
    hierarchy中的cgroup节点可以包含零或多个子节点,子节点继承父节点的属性。整个系统可以有多个hierarchy
     
     
    四、组件之间的关系
    1、同一个hierarchy能够附加一个或多个subsystem
    cpu和memory subsystems(或者任意多个subsystems)附加到同一个hierarchy
    2、cpu subsystem已经附加到了hierarchy A,并且memory subsystem已经附加到了hierarchy B,此时cpu subsystem不能在附加到hierarchy B
    3、一个task不能存在于同一个hierarchy的不同cgroup,但可以存在在不同hierarchy中的多个cgroup
    系统每次新建一个hierarchy时,该系统上的所有task默认构成了这个新建的hierarchy的初始化cgroup,这个cgroup也称为root cgroup。
    对于你创建的每个hierarchy,task只能存在于其中一个cgroup中,即一个task不能存在于同一个hierarchy的不同cgroup中,但是一个task可以存在在不同hierarchy中的多个cgroup中。
    如果操作时把一个task添加到同一个hierarchy中的另一个cgroup中,则会从第一个cgroup中移除。
    如下图,cpu和memory被附加到cpu_mem_cg的hierarchy。而net_cls被附加到net hierarchy。并且httpd进程被同时加到了cpu_mem_cg hierarchy的cg1 cgroup中和net hierarchy的cg3 cgroup中。并通过两个hierarchy的subsystem分别对httpd进程进行cpu,memory及网络带宽的限制。

    4、子task继承父task cgroup的关系
    系统中的任何一个task(Linux中的进程)fork自己创建一个子task(子进程)时,子task会自动的继承父task cgroup的关系,在同一个cgroup中,但是子task可以根据需要移到其它不同的cgroup中。父子task之间是相互独立不依赖的。
    如下图,httpd进程在cpu_and_mem hierarchy的/cg1 cgroup中并把PID 4537写到该cgroup的tasks中。
    之后httpd(PID=4537)进程fork一个子进程httpd(PID=4840)与其父进程在同一个hierarchy的统一个cgroup中,但是由于父task和子task之间的关系独立不依赖的,所以子task可以移到其它的cgroup中。

     五、Cgroup使用

    1、创建hierarchy

    # mkdir /cgroup/cpuset
    # mount -t cgroup -o cpuset cpuset /cgroup/cpuset
    # mount -t cgroup|grep cpuset
    cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
    cpuset on /cgroup/cpuset type cgroup (rw,relatime,cpuset)
    2、卸载hierarchy

    # umount /cgroup/cpuset
    3、创建Cgroup
    # mkdir /cgroup/cpuset/group1
    # ls /cgroup/cpuset/group1/   
    cgroup.clone_children  cpuset.cpu_exclusive   cpuset.effective_mems  cpuset.memory_migrate      cpuset.memory_spread_slab  cpuset.sched_relax_domain_level
    cgroup.event_control   cpuset.cpus            cpuset.mem_exclusive   cpuset.memory_pressure     cpuset.mems                notify_on_release
    cgroup.procs           cpuset.effective_cpus  cpuset.mem_hardwall    cpuset.memory_spread_page  cpuset.sched_load_balance  tasks
    # ls /sys/fs/cgroup/cpuset/group1/
    cgroup.clone_children  cpuset.cpu_exclusive   cpuset.effective_mems  cpuset.memory_migrate      cpuset.memory_spread_slab  cpuset.sched_relax_domain_level
    cgroup.event_control   cpuset.cpus            cpuset.mem_exclusive   cpuset.memory_pressure     cpuset.mems                notify_on_release
    cgroup.procs           cpuset.effective_cpus  cpuset.mem_hardwall    cpuset.memory_spread_page  cpuset.sched_load_balance  tasks
    可以看到cpuset子系统同时挂载到cgroup/cpuset和/sys/fs/cgroup/cpuset,其实底层是连接到同一个inode,相当于硬连接
     
    4、设置参数

    # echo 0-1 >/cgroup/cpuset/group1/cpuset.cpus 
    # echo 0 >/cgroup/cpuset/group1/cpuset.mems
    5、限制进程

    # echo 1024 > /sys/fs/cgroup/cpuset/group1/tasks 
    六、subsystem
    1、当前系统支持的子系统

    # more /proc/cgroups 
    #subsys_name    hierarchy       num_cgroups     enabled
    cpuset             9                  1            1
    cpu               10                  2            1
    cpuacct           10                  2            1
    memory             7                  2            1
    devices            4                  1            1
    freezer           11                  1            1
    net_cls            3                  1            1
    blkio             5                  1            1
    perf_event        6                  1            1
    hugetlb           8                  1            1
    pids              2                  2            1
    net_prio          3                  1            1
    • subsys_name:subsystem的名字
    • hierarchy:subsystem所关联到的cgroup树的ID,如果多个subsystem关联到同一颗cgroup树,那么他们的这个字段将一样
    • num_cgroups:subsystem所关联的cgroup树中进程组的个数,也即树上节点的个数
    • enabled:是否开启开子系统,1表示开启,0表示没有被开启
    2、子系统介绍
    • cpu:用来限制cgroup的CPU使用率。
    • cpuacct:统计cgroup的CPU的使用率。
    • cpuset:绑定cgroup到指定CPUs和NUMA节点。
    • memory:统计和限制cgroup的内存的使用率,包括process memory, kernel memory, 和swap。
    • devices:限制cgroup创建(mknod)和访问设备的权限。
    • freezer:suspend和restore一个cgroup中的所有进程。
    • net_cls:将一个cgroup中进程创建的所有网络包加上一个classid标记,用于tc和iptables。 只对发出去的网络包生效,对收到的网络包不起作用。
    • blkio:限制cgroup访问块设备的IO速度。
    • perf_event:对cgroup进行性能监控
    • net_prio:针对每个网络接口设置cgroup的访问优先级。
    • hugetlb:限制cgroup的huge pages的使用量。
    • pids:限制一个cgroup及其子孙cgroup中的总进程数。
    3、查看进程所属的cgroup

    # more /proc/{PID}/cgroup 
    11:freezer:/
    10:cpuacct,cpu:/
    9:cpuset:/
    8:hugetlb:/
    7:memory:/
    6:perf_event:/
    5:blkio:/
    4:devices:/
    3:net_prio,net_cls:/
    2:pids:/
    1:name=systemd:/system.slice/filebeat.service
    第一列:cgroup树的ID
    第二列:和cgroup树绑定的所有subsystem,多个subsystem之间用逗号隔开。这里name=systemd表示没有和任何subsystem绑定,只是给他起了个名字叫systemd
    第三列:进程在cgroup树中的路径,这个路径是相对于挂载点的相对路径

  • 相关阅读:
    MapReduce_wordcount
    HDFS脚本
    学习笔记——git
    CSS3选择器:nth-of-type
    CSS命名规范
    关于line-height
    css新特性 box-flex/flex 弹性盒状模型
    开始手机端
    sass
    优雅降级与渐进增强
  • 原文地址:https://www.cnblogs.com/guoxianqi2020/p/14031218.html
Copyright © 2011-2022 走看看