使用cgroup限制资源方法

一笑的小屋 / 2024-10-08 / 原文

1. 使用cgroup(控制组)限制进程占用内存方法
    1:创建cgroup目录:
    首先,需要在/sys/fs/cgroup/memory目录下创建一个子目录
    sudo mkdir /sys/fs/cgroup/memory/myapp    // sudo mkdir /sys/fs/cgroup/cpu/myapp,限制CPU方法
 
    2:设置内存限制:
    sudo sh -c 'echo 50M > /sys/fs/cgroup/memory/myapp/memory.limit_in_bytesmemory.soft_limit_in_bytes'
    // 限制CPU方法:sudo sh -c 'echo 50000 > /sys/fs/cgroup/cpu/myapp/cpu.cfs_quota_us'  
    // 限制CPU方法:sudo sh -c 'echo 100000 > /sys/fs/cgroup/cpu/myapp/cpu.rt_period_us'
    // 其中,cpu.cfs_quota_us表示CPU时间配额(单位为微秒),cpu.rt_period_us表示CPU周期(单位为微秒),这里将CPU时间配额设置为50000微秒,CPU时间周期设置为100000微秒,表示CPU使用率限制为50%。
 
    3:添加进程到cgroup:
    echo >/sys/fs/cgroup/memory/myapp/cgroup.procs   
// 这一项限制各个资源处理方法都一样, 将pid写入cgroup.procs,则该pid所在的线程组及该pid的子进程等都会自动加入到cgroup中。将pid写入tasks,则只限制该pid。
 
    4:禁用OOM:
    echo 1 >/sys/fs/cgroup/memory/myapp/memory.oom_control   
//默认当进程超过设置的内存上限后,会直接通过oom kill掉进程,这里通过禁用oom功能,让进程内存超限后不直接kill掉,而是一直等待可用内存,直到满足自身需求
 
 
2. 使用cgroup(控制组)限制进程磁盘I/O方法
    1:创建cgroup目录:
    首先,需要在/sys/fs/cgroup/blkio目录下创建一个子目录
    sudo mkdir /sys/fs/cgroup/blkio/myapp
 
    2:设置 I/O 限制:
        限制设备的读取带宽(字节/秒)
        sudo sh -c 'echo 8:16 1048576'  > /sys/fs/cgroup/blkio/myapp/blkio.throttle.read_bps_device  //限制磁盘读取速度为:为1M/S
        限制设备的写入带宽(字节/秒)
        sudo sh -c 'echo 8:16 1048576'  > /sys/fs/cgroup/blkio/myapp/blkio.throttle.write_bps_device //限制磁盘写入速度为:为1M/S
        blkio.throttle.read_iops_device:限制设备的读取 IOPS(设备每秒钟可以执行的读/写请求数上限)//单位为 bios/second
        blkio.throttle.write_iops_device:限制设备的写入 IOPS(设备每秒钟可以执行的读/写请求数上限)//单位为 bios/second
 
    3:添加进程到cgroup:
    echo >/sys/fs/cgroup/memory/myapp/cgroup.procs
 
 
3. 使用cgroup(控制组)限制网络带宽的方法
    1:创建cgroup目录:
    首先,需要在/sys/fs/cgroup/net_cls目录下创建一个子目录 
mkdir /sys/fs/cgroup/net_cls
    mount -t cgroup -onet_cls net_cls /sys/fs/cgroup/net_cls
    mkdir /sys/fs/cgroup/net_cls/0
 
    2:设置 cgroup 的 classid,用于标识网络流量的类别:
    echo 0x100001 >  /sys/fs/cgroup/net_cls/0/net_cls.classid
 
    3:使用 tc 命令配置网络限制:
        1> 建立队列:
        tc qdisc add dev eth0 root handle 10: htb
 
        2> 配置分类:
        tc class add dev eth0 parent 10: classid 10:1 htb rate 40mbit
 
        3> 添加过滤器:
        tc filter add dev eth0 parent 10: protocol ip prio 10 handle 1: cgroup
 
    4:添加进程到cgroup:
        手动写入进程ID:echo >/sys/fs/cgroup/memory/myapp/cgroup.procs   //需要先通过ps  -ef命令获取进程ID
       自动写入进程ID:cgexec -g net_cls:myapp xxx这里是要执行的命令,会自动写入进程ID到cgroup.procs文件中
    /*  将pid写入cgroup.procs,则该pid所在的线程组及该pid的子进程等都会自动加入到cgroup中 */
 
    tc class change dev eth0 parent 10:  classid 1:10 htb rate 91200Kbit ceil 91200Kbit //动态改变带宽
    tc qdisc del dev eth0 root        //删除qdisc和class配置
    tc qdisc show dev eth0            //显示qdisc配置
    tc class show dev eth0             //显示class配置
    tc filter show/del dev eth0       //查看/删除过滤配置
    /* 这里,eth0 是你想要限制网络流量的网络设备名称。htb(Hierarchical Token Bucket)是一种用于流量整形的算法,它允许你设置带宽限制。*/