使用cgroup限制资源方法
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)是一种用于流量整形的算法,它允许你设置带宽限制。*/
无论从事什么行业,只要做好两件事就够了,一个是你的专业、一个是你的人品,专业决定了你的存在,人品决定了你的人脉,剩下的就是坚持,用善良专业和真诚赢取更多的信任。