linux中cgroup是用于进程资源限制的重要技术,cgroup的命令众多,见之前文章 推荐!两个有用的运维工具nsenter+cgroup(一) 说明,本文用一个例子讲解操作cgroup的5个常用命令,分别为cgcreate、cgset、cgexec、 cgclassify、cgdelete。
一个最多可以跑满3个cpu的shell脚本 cpu-demo.sh
shell
[root@gentlewok 10122]# cat /tmp/cpu-demo.sh
for i in
`seq 3`
do
while
:;do echo >/dev/null;
done
&
done
作用:用于创建一个某类型的资源控制组
具体类型可在具体的linux系统中查看,类型如下ll命令所示,本文以cpu类型作为演示cgroup的cpu资源控制功能,其他类型的,可根据下文样例思路变换配置即
[root@gentlewok 10122]# ll /sys/fs/cgroup/
total 0
drwxr-xr-x.
6 root root 0
Jun
2
03:37 blkio
lrwxrwxrwx.
1 root root 11
Jun
2
03:37 cpu -> cpu,cpuacct
lrwxrwxrwx.
1 root root 11
Jun
2
03:37 cpuacct -> cpu,cpuacct
drwxr-xr-x.
7 root root 0
Jun
2
03:37 cpu,cpuacct
drwxr-xr-x.
4 root root 0
Jun
2
03:37 cpuset
drwxr-xr-x.
6 root root 0
Jun
2
03:37 devices
drwxr-xr-x.
4 root root 0
Jun
2
03:37 freezer
drwxr-xr-x.
4 root root 0
Jun
2
03:37 hugetlb
drwxr-xr-x.
6 root root 0
Jun
2
03:37 memory
lrwxrwxrwx.
1 root root 16
Jun
2
03:37 net_cls -> net_cls,net_prio
drwxr-xr-x.
4 root root 0
Jun
2
03:37 net_cls,net_prio
lrwxrwxrwx.
1 root root 16
Jun
2
03:37 net_prio -> net_cls,net_prio
drwxr-xr-x.
4 root root 0
Jun
2
03:37 perf_event
drwxr-xr-x.
6 root root 0
Jun
2
03:37 pids
drwxr-xr-x.
6 root root 0
Jun
2
03:37 systemd
[root@gentlewok 10122]# ll /sys/fs/cgroup/
| wc -l
16
创建一个cpu类型名称为gentlewok的资源控制组
cgcreate -g cpu:gentlewok 创建一个cpu类型的资源控制组
作用:用于限制某一类型的资源使用值
为gentlewok设置cpu配额核数为6核,即6000000,单位为微秒(us), 1000000us = 1s
cgset -r cpu.cfs_quota_us=6000000
/gentlewok # 配额6核
cgset -r cpu.cfs_period_us=1000000
/gentlewok # cpu时间片占用为1s,两个参数结合,在多核系统上,理论上可以跑到600%,即占满6核cpu资源
具体有哪些值可以设置呢?可以查看对应类型控制组的目录 /sys/fs/cgroup/类型/控制组名,本文是cpu类型,控制组名为gentlewok
[root@gentlewok gentlewok]# ls #可以设置的选项
cgroup.clone_children cgroup.procs cpuacct.usage cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_release
cgroup.event_control cpuacct.stat cpuacct.usage_percpu cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat tasks
[root@gentlewok gentlewok]# pwd
/sys/fs/cgroup/cpu/gentlewok
[root@gentlewok gentlewok]# ls
cgroup.clone_children cgroup.procs cpuacct.usage cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_release
cgroup.event_control cpuacct.stat cpuacct.usage_percpu cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat tasks
[root@gentlewok gentlewok]# cat cpu.cfs_quota_us #查看配置已生效
6000000
[root@gentlewok gentlewok]# cat cpu.cfs_period_us #查看配置已生效
1000000
作用:用于在一个控制组中启动进程,控制组内的资源限制策略作用于该进程
在gentlewok控制组中启动 cpu-demo.sh
cgexec -g cpu:gentlewok /tmp/cpu-demo.sh
查看cpu资源控制情况,基本跑满3核。(上文配额6核,程序设计只跑3核)
只配额1核会发生什么
cgset -r cpu.cfs_quota_us=1000000
/gentlewok
可以看到百分数加起来约等于100%,说明配额生效,cpu使用资源被限制住。
提示
cgset -r cpu.cfs_quota_us=1000000
/gentlewok 等价于
echo 1000000
>
/sys/fs/cgroup/cpu/gentlewok/cfs_quota_us
如果这个进程已经是启动状态,该命令可将一个已存在的进程加入到资源控制组,加入后,控制组内的资源限制策略作用于该进程
将某进程的pid加入gentlewok控制组
cgclassify -g cpu:gentlewok $pid
作用:删除一个某类型的资源控制组
删除gentlewok控制组
cgdelete -g cpu:gentlewok
默认启动一个命令它的资源限制是什么呢?
cpu默认是无限配额,理论上可以打满整个服务器cpu,这样的配置在生产环境是有风险!!!其他资源,如内存,磁盘,网络等的默认配置,是否有风险呢?又该如何修改呢?读者可根据本文样例自行探索
[root@gentlewok gentlewok]#
/tmp/cpu-demo.sh
#找到该进程引用的资源控制组
[root@gentlewok ~]# cat /proc/5056/cgroup
11:freezer:/
10:memory:/system.slice/sshd.service
9:perf_event:/
8:cpuacct,cpu:/system.slice/sshd.service
7:hugetlb:/
6:blkio:/system.slice/sshd.service
5:pids:/system.slice/sshd.service
4:devices:/system.slice/sshd.service
3:cpuset:/
2:net_prio,net_cls:/
1:name=systemd:/system.slice/sshd.service
[root@gentlewok sshd.service]# pwd
/sys/fs/cgroup/cpu/system.slice/sshd.service
[root@gentlewok sshd.service]# ls
cgroup.clone_children cgroup.procs cpuacct.usage cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_release
cgroup.event_control cpuacct.stat cpuacct.usage_percpu cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat tasks
[root@gentlewok sshd.service]# cat cpu.rt_period_us
1000000
#默认-1为无线配额,理论上可以打满整个服务器cpu
[root@gentlewok sshd.service]# cat cpu.cfs_quota_us
-1