zoukankan      html  css  js  c++  java
  • cgroup的简单使用

    1 简介

             Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。这个项目最早是由Google的工程师在2006年发起(主要是Paul Menage和Rohit Seth),最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去。然后,其它开始了他的发展。 

             Linux CGroupCgroup 可为系统中所运行任务(进程)的用户定义组群分配资源—比如CPU 时间、系统内存、网络带宽或者这些资源的组合。可以监控配置的​​​ cgroup,拒绝cgroup 访问某些资源,甚至在运行的系统中动态配置cgroup。

    1.1 主要功能

    (1)限制资源使用,比如内存使用上限以及文件系统的缓存限制。

    (2)优先级控制,CPU利用和磁盘IO吞吐。

    (3)一些审计或一些统计,主要目的是为了计费。

    (4)挂起进程,恢复执行进程。

    1.2 cgroups子系统

    Cgroups(Control Groups)基于进程的限制,而非用户,因此对于超户运行的进程也是一样;

    cgroups子系统:

    1.blkio 限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb。
    2.cpu 限制使用cpu比例
    3.cpuacct 产生cgroup任务的cpu资源报告。
    4.cpuset 多核心的cpu时为cgroup任务分配单独的cpu和内存 绑定进程和cpu减少上下文切换 内存访问情况 就近访问内存
    5.devices 允许或拒绝对设备的访问。
    6.freezer 暂停和恢复cgroup任务。
    7.memory 设置内存限制以及产生内存资源报告。
    8.net_cls 可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
    9.net_prio — 这个子系统用来设计网络流量的优先级。

    10.ns 可以使不同 cgroups 下面的进程使用不同的 namespace。

    11.hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。

    绑定进程到指定cpu核数

    #yum安装
    #yum install libcgroup libcgroup-tools  numactl  -y
    #获取CPU线程数
    #grep 'processor' /proc/cpuinfo | sort -u | wc -l
    #获取CPU NUMA内存节点信息
    #numactl --hardware
    或
    #lscpu | grep NUMA

     

    #创建设置small组策略 4核
    cgcreate -g cpuset:small
    cgset -r cpuset.cpus=0-3 small
    cgset -r cpuset.mems=0 small
    
    #创建设置large组策略 8核 
    cgcreate -g cpuset:large
    cgset -r cpuset.cpus=0-7 large
    cgset -r cpuset.mems=0 large
    

    #默认的cpuset.cpus和cpuset.mems是空的;需要同时设定这2个值,其中mems的值参考numa的node数字,上面通过numactl --hardware查到是0

    注意

    1.cpuset子系统是有两个参数是强制要求定义的,cpuset.cpus和cpuset.mems。

    cpuset.cpus(强制)

    指定允许这个cgroup 中任务访问的CPU。这是一个用逗号分开的列表,格式为ASCII,使​用小横线(”-”)代表范围。​

    cpuset.mems(强制)

    指定允许这个cgroup 中任务可访问的内存节点。这是一个用逗号分开的列表,格式​​​为ASCII,使用小横线(”-”)代表范围。

    2.对于多线程的程序,该方法不生效;
    3. 配置完在/sys/fs/cgroup/cpuset目录会出现smal,large目录。

    # 运行命令

    #cgexec -g cpuset:small 程序运行命令
    #cgexec -g cpuset:large 程序运行命令
    

    #示例 

    #编写一个消耗cpu的脚本

    vi t1.sh
    #/bin/bash
    x=0
    while [ True ];do
        x=$x+1
    done;

    #限制程序运行在固定cpu核数上                           

    #cgexec -g cpuset:small sh t1.sh &

    #运行top命令,然后按1,可以看到每个cpu核数的情况

    3 限制进程cpu使用率

    3.1 示例1

    #yum安装
    #yum install libcgroup libcgroup-tools  numactl  -y
    #systemctl status cgconfig.service 
    #systemctl start cgconfig.service
    #查看cgroup挂载点(centos7.7),此处可参见cgroups子系统
    #lssubsys -am
    

    #创建隔离组
    #cd /sys/fs/cgroup/cpu
    #mkdir cpu_test
    说明:目录创建完成会自动生成以下文件(注:该目录无法手动删除,如果不加入开机自启,重启后会消失)
    #ls cpu_test/
    

    #跑一个耗cpu的脚本
    #vi t1.sh
    #/bin/bash
    x=0
    while [ True ];do
        x=$x+1
    done;
    #chmod +x t1.sh
    #sh t1.sh  &
    

    #修改参数
    # echo 20000 > /sys/fs/cgroup/cpu/cpu_test/cpu.cfs_quota_us
    注:默认-1不限制,现在改成20000,是将cpu.cfs_quota_us设为20000,相对于cpu.cfs_period_us的100000是20%;可以理解cpu使用率限制在20%;
    
    #找到进程号增加到cpu tasks里面,在看top,cpu使用率很快就下来
    #echo 2938 >> /sys/fs/cgroup/cpu/cpu_test/tasks
    

    说明:在上面的情况下,如果将三个进程pid都写入到tasks,会出现三个进程共享20%cpu的情况;

    3.2 示例2

    说明:该部分内容补充示例1,使用命令创建控制群组;

    #创建控制群组
    #cgcreate -g cpu:/g1
    说明:这个命令会创建/sys/fs/cgroup/cpu/g1目录出来,在这个目录下有各种cgroup cpu的配置文件;
    
    #设置CPU限制参数
    #cgset -r cpu.cfs_quota_us=20000 g1
    #查看是否设置成功
    #cgget -r cpu.cfs_quota_us g1
    
    #启动进程,通过top可以看到cpu占用100%,同时拿到进程pid:2231
    #cat t1.sh
    #/bin/bash
    x=0
    while [ True ];do
        x=$x+1
    done;
    #sh  /tmp/t1.sh  &
    
    #将此进程加入控制群组g1
    #cgclassify -g cpu:/g1 2231
    #cat /sys/fs/cgroup/cpu/g1/tasks
    通过top看,cpu消耗变成了20%
    注意:最好将一个进程写在一个控制组内;将多个进程写在一个控制组会共享cpu限制;
    如:在一个控制组内写入3个进程,cpu限制使用为20%,每个进程大概会占6%左右;
    

    4 限制内存使用量

    #创建控制群组g2
    #cgcreate -g memory:g2
    
    #查看默认内存是没有限制的
    cgget -r memory.limit_in_bytes g2
    
    #限制内存只有1GB
    cgset -r memory.limit_in_bytes=1073741824 g2
    
    #执行/tmp/highmemory.sh,进程号是21127 
    #vi /tmp/highmem.sh
    #/bin/bash
    x="a"
    while [ True ];do
        x=$x$x
    done;
    
    #将highmemory.sh进程加入g2的控制
    #cgclassify -g memory:g2 21127
    

    限制磁盘读取速度

    #要控制/dev/sdb的磁盘,通过下述命令查到磁盘驱动号8,16
    #ls -l /dev/sdb
    

    #创建控制组,设定8,16磁盘有1MB的读取限制
    #cgcreate -g blkio:g1 
    #cgset -r blkio.throttle.read_bps_device='8:16 10485760' g1
    
    #启动读取测试命令,拿到pid 14468
    #dd if=/dev/sdb of=/dev/null
    
    #通过命令可以看到对磁盘读写速度的消耗
    #iotop
    
    #将进程加入g1控制组后,读取速度被限制
    #cgclassify -g blkio:g1 14468
    

    -------------------------------------------------------------------------------------------------------------------------

    参考链接:

    https://www.cnblogs.com/menkeyi/p/10941843.html

    https://www.jianshu.com/p/dc3140699e79

    https://blog.csdn.net/micklf/article/details/60868649

    https://blog.csdn.net/kwame211/article/details/78730705  

  • 相关阅读:
    自习任我行第二阶段个人总结9
    自习任我行第二阶段个人总结8
    自习任我行第二阶段个人总结7
    自习任我行第二阶段个人总结6
    自习任我行第二阶段个人总结5
    自习任我行 第二阶段每日个人总结4
    自习任我行 第二阶段每日个人总结3
    自习任我行 第二阶段每日个人总结2
    自习任我行 第二阶段每日个人总结1
    结课总结
  • 原文地址:https://www.cnblogs.com/llwxhn/p/12558577.html
Copyright © 2011-2022 走看看