转载请注明出处:https://blog.csdn.net/l1028386804/article/details/89388408
CGroup是一种资源隔离方案
CGroup提供了一些子系统:
安装CGroup:
yum install -y libcgroup
chkconfig --add cgconfig
启动CGroup
service cgconfig start
检查CGroup
chkconfig --list cgconfig
service cgconfig status
如下:
[root@binghe ~]# chkconfig --list cgconfig
cgconfig 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@binghe ~]# service cgconfig status
Running
使用chkconfig命令的list参数可以看到Linux中已经部署的CGroup服务。使用chkconfig命令可以知道,当操作系统处于某个状态时该服务启动或者停止。
CGroup服务启动后,会在根目录下生成/cgroup的目录,如下:
[root@binghe /]# ll /cgroup/
total 0
drwxr-xr-x. 2 root root 0 Apr 18 13:57 blkio
drwxr-xr-x. 2 root root 0 Apr 18 13:57 cpu
drwxr-xr-x. 2 root root 0 Apr 18 13:57 cpuacct
drwxr-xr-x. 2 root root 0 Apr 18 13:57 cpuset
drwxr-xr-x. 2 root root 0 Apr 18 13:57 devices
drwxr-xr-x. 2 root root 0 Apr 18 13:57 freezer
drwxr-xr-x. 2 root root 0 Apr 18 13:57 memory
drwxr-xr-x. 2 root root 0 Apr 18 13:57 net_cls
每个子系统分别对应一个控制项。
在/cgroup下,分别对应着CGroup的各个子系统,各子系统下会存在多个配置文件,其中每个子系统中均会存在以下配置文件。
操作CGroup可以通过文本编辑器(vi/vim)对虚拟文件系统直接进行测试,或者通过CGroup提供的命令进行测试。
查看CGroup提供的命令:
[root@binghe cgroup]# ll /bin/ | grep cg
-rwxr-sr-x. 1 root cgred 11984 Oct 9 2018 cgclassify
-rwxr-xr-x. 1 root root 12712 Oct 9 2018 cgcreate
-rwxr-xr-x. 1 root root 11472 Oct 9 2018 cgdelete
-rwxr-sr-x. 1 root cgred 12008 Oct 9 2018 cgexec
-rwxr-xr-x. 1 root root 15608 Oct 9 2018 cgget
-rwxr-xr-x. 1 root root 12480 Oct 9 2018 cgset
-rwxr-xr-x. 1 root root 15952 Oct 9 2018 cgsnapshot
-rwxr-xr-x. 1 root root 13320 Oct 9 2018 lscgroup
首先,编写一个比较耗CPU的程序cpu.c
#include
#include
int main(void){
while(1){
}
return 1;
}
在命令行执行如下命令:
[root@binghe storm]# ll
total 4
-rw-r--r--. 1 root root 82 Apr 18 16:15 cpu.c
[root@binghe storm]# gcc cpu.c
[root@binghe storm]# ll
total 12
-rwxr-xr-x. 1 root root 6261 Apr 18 16:18 a.out
-rw-r--r--. 1 root root 82 Apr 18 16:15 cpu.c
[root@binghe storm]# ./a.out
重新打开一个终端,输入top查看CPU使用率
top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2304 root 20 0 3920 368 288 R 100.0 0.0 0:17.27 a.out
可以看到在单核CPU上的使用率为100%
接下来尝试使用CGroup对其进行限制。首先创建CPU控制组test,并查看创建后的信息,如下:
[root@binghe storm]# mkdir /cgroup/cpu/test
[root@binghe storm]# ll /cgroup/cpu/test/
total 0
--w--w--w-. 1 root root 0 Apr 18 16:27 cgroup.event_control
-rw-r--r--. 1 root root 0 Apr 18 16:27 cgroup.procs
-rw-r--r--. 1 root root 0 Apr 18 16:27 cpu.cfs_period_us
-rw-r--r--. 1 root root 0 Apr 18 16:27 cpu.cfs_quota_us
-rw-r--r--. 1 root root 0 Apr 18 16:27 cpu.rt_period_us
-rw-r--r--. 1 root root 0 Apr 18 16:27 cpu.rt_runtime_us
-rw-r--r--. 1 root root 0 Apr 18 16:27 cpu.shares
-r--r--r--. 1 root root 0 Apr 18 16:27 cpu.stat
-rw-r--r--. 1 root root 0 Apr 18 16:27 notify_on_release
-rw-r--r--. 1 root root 0 Apr 18 16:27 tasks
设置改组test的CPU使用权重;假设限制其只能使用60%的CPU,将60000写入cpu.cfs_quota_us中,如下:
[root@binghe storm]# echo 60000 >> /cgroup/cpu/test/cpu.cfs_quota_us
[root@binghe storm]# cat /cgroup/cpu/test/cpu.cfs_quota_us
60000
将需要做限制的进程ID写入tasks文件中,如下:
[root@binghe storm]# ps -ef | grep a.out | grep -v grep
root 2304 2288 99 16:32 pts/2 00:00:51 ./a.out
[root@binghe storm]#
[root@binghe storm]# echo 2304 >> /cgroup/cpu/test/tasks
[root@binghe storm]# cat /cgroup/cpu/test/tasks
2304
接下来,我们继续看CPU占用率
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2304 root 20 0 3920 364 288 R 60 0.0 1:49.66 a.out
可以发现,在写入后CPU限制即时生效。
关于CPU控制还有一个重要的属性,即cpu.shares,用于控制多个进程组之间可使用CPU的比例,如存在进程组test1和test2,其shares分别设置为3和7,则表示进程组test1中的所有进程能够使用的CPU时间的总和对比于test2为3比7。
首先,编写一个程序mem.c,使之循环申请800MB内存
#include
#include
#include
#define MEM_LENGTH 1048576
#define MEM_MAX 800
int main(void){
char *mem = NULL;
int i = 0;
for(; i < MEM_MAX; i++){
mem = (char*) malloc(MEM_LENGTH);
if(mem != NULL){
memset(mem, 0, MEM_LENGTH);
}
if(i == 10){
sleep(60);
}
}
while(1){
sleep(1);
}
return 1;
}
在命令行编译运行该程序,如下:
[root@binghe storm]# ll
total 4
-rw-r--r--. 1 root root 346 Apr 18 16:48 mem.c
[root@binghe storm]# gcc mem.c
[root@binghe storm]# ll
total 12
-rwxr-xr-x. 1 root root 6752 Apr 18 16:50 a.out
-rw-r--r--. 1 root root 346 Apr 18 16:48 mem.c
[root@binghe storm]# ./a.out
运行一段时间,会发现该进程占用内存约800MB左右
top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2508 root 20 0 806m 803m 288 R 0.0 21.7 0:17.27 a.out
接下来,尝试使用CGroup对其进行限制,创建test进程组并限制其最大能够使用内存为100MB(102457600字节)。
[root@binghe ~]# mkdir /cgroup/memory/test
[root@binghe ~]# ll /cgroup/memory/test/
total 0
--w--w--w-. 1 root root 0 Apr 18 17:00 cgroup.event_control
-rw-r--r--. 1 root root 0 Apr 18 17:00 cgroup.procs
-rw-r--r--. 1 root root 0 Apr 18 17:00 memory.failcnt
--w-------. 1 root root 0 Apr 18 17:00 memory.force_empty
-rw-r--r--. 1 root root 0 Apr 18 17:00 memory.limit_in_bytes
-rw-r--r--. 1 root root 0 Apr 18 17:00 memory.max_usage_in_bytes
-rw-r--r--. 1 root root 0 Apr 18 17:00 memory.memsw.failcnt
-rw-r--r--. 1 root root 0 Apr 18 17:00 memory.memsw.limit_in_bytes
-rw-r--r--. 1 root root 0 Apr 18 17:00 memory.memsw.max_usage_in_bytes
-r--r--r--. 1 root root 0 Apr 18 17:00 memory.memsw.usage_in_bytes
-rw-r--r--. 1 root root 0 Apr 18 17:00 memory.move_charge_at_immigrate
-rw-r--r--. 1 root root 0 Apr 18 17:00 memory.oom_control
-rw-r--r--. 1 root root 0 Apr 18 17:00 memory.soft_limit_in_bytes
-r--r--r--. 1 root root 0 Apr 18 17:00 memory.stat
-rw-r--r--. 1 root root 0 Apr 18 17:00 memory.swappiness
-r--r--r--. 1 root root 0 Apr 18 17:00 memory.usage_in_bytes
-rw-r--r--. 1 root root 0 Apr 18 17:00 memory.use_hierarchy
-rw-r--r--. 1 root root 0 Apr 18 17:00 notify_on_release
-rw-r--r--. 1 root root 0 Apr 18 17:00 tasks
[root@binghe ~]# cat /cgroup/memory/test/memory.limit_in_bytes
9223372036854775807
[root@binghe ~]# echo 104857600 > /cgroup/memory/test/memory.limit_in_bytes
[root@binghe ~]# cat /cgroup/memory/test/memory.limit_in_bytes
104857600
重新运行程序,并检查内存
[root@binghe storm]# gcc mem.c
[root@binghe storm]# ll
total 12
-rwxr-xr-x. 1 root root 6752 Apr 18 16:50 a.out
-rw-r--r--. 1 root root 346 Apr 18 16:48 mem.c
[root@binghe storm]# ./a.out
top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2383 root 20 0 15220 11m 288 R 0.0 21.7 0:10.29 a.out
在测试中程序还没有完全申请内存时将其加入CGroup的内存中,如下:
[root@binghe ~]# cat /cgroup/memory/test/tasks;\
> echo `ps -ef | grep a.out | grep -v grep | awk '{print $2}'`\
> >/cgroup/memory/test/tasks; \
> cat /cgroup/memory/test/tasks
2383
经过一段时间,发现被限制内存的进程组里面的进程被操作系统杀掉了。如下:
[root@binghe storm]# ./a.out
Killed
通过设置参数memory.oom_disable为0或1,可以控制使用的内存超过限制的内存时是由操作系统杀死还是进程进入休眠状态。命令如下:
[root@binghe ~]# cat /cgroup/memory/test/memory.oom_control
oom_kill_disable 0
under_oom 0
[root@binghe ~]# echo 1 > /cgroup/memory/test/memory.oom_control
[root@binghe ~]# cat /cgroup/memory/test/memory.oom_control
oom_kill_disable 1
under_oom 0
首先,编写一个测试程序cpuset.c,使之占用操作系统的多个核,同时CPU使用率均较高
#include
#include
#include
#include
#define PRO_MAX 3
int main(void){
int i = 0;
for(; i < PRO_MAX; i++){
pid_t pid = fork();
if(pid < 0){
break;
}else if(pid == 0){
while(1){
}
}
}
while(1){
sleep(1);
}
return 1;
}
编译并运行cputest.c程序,如下:
[root@binghe storm]# gcc cpuset.c
[root@binghe storm]# ./a.out
查看CPU使用率如下:
top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2413 root 20 0 3920 96 12 R 100.0 0.0 0:11.85 a.out
2414 root 20 0 3920 96 12 R 100.0 0.0 0:11.84 a.out
2415 root 20 0 3920 96 12 R 99.8 0.0 0:11.84 a.out
设置进程组使用的CPU核心,命令如下:
[root@binghe ~]# mkdir /cgroup/cpuset/test
[root@binghe ~]# ll /cgroup/cpuset/test
total 0
--w--w--w-. 1 root root 0 Apr 18 17:26 cgroup.event_control
-rw-r--r--. 1 root root 0 Apr 18 17:26 cgroup.procs
-rw-r--r--. 1 root root 0 Apr 18 17:26 cpuset.cpu_exclusive
-rw-r--r--. 1 root root 0 Apr 18 17:26 cpuset.cpus
-rw-r--r--. 1 root root 0 Apr 18 17:26 cpuset.mem_exclusive
-rw-r--r--. 1 root root 0 Apr 18 17:26 cpuset.mem_hardwall
-rw-r--r--. 1 root root 0 Apr 18 17:26 cpuset.memory_migrate
-r--r--r--. 1 root root 0 Apr 18 17:26 cpuset.memory_pressure
-rw-r--r--. 1 root root 0 Apr 18 17:26 cpuset.memory_spread_page
-rw-r--r--. 1 root root 0 Apr 18 17:26 cpuset.memory_spread_slab
-rw-r--r--. 1 root root 0 Apr 18 17:26 cpuset.mems
-rw-r--r--. 1 root root 0 Apr 18 17:26 cpuset.sched_load_balance
-rw-r--r--. 1 root root 0 Apr 18 17:26 cpuset.sched_relax_domain_level
-rw-r--r--. 1 root root 0 Apr 18 17:26 notify_on_release
-rw-r--r--. 1 root root 0 Apr 18 17:26 tasks
[root@binghe ~]# echo 0 > /cgroup/cpuset/test/cpuset.mems
[root@binghe ~]# echo 0 > /cgroup/cpuset/test/cpuset.cpus
[root@binghe ~]# cat /cgroup/cpuset/test/cpuset.cpus
0
将需要进行CPU核心限制的进程加入进程组中,如下:
[root@binghe ~]# for i in `ps -ef | grep a.out | grep -v grep | awk '{print $2}'`; do \
> echo $i > /cgroup/cpuset/test/tasks; \
> done
[root@binghe ~]# cat /cgroup/cpuset/test/tasks
2412
2413
2414
2415
进程加入cpuset进程组后,系统整体CPU使用率情况如下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2415 root 20 0 3920 96 12 R 33.6 0.0 6:47.83 a.out
2413 root 20 0 3920 96 12 R 33.2 0.0 6:48.08 a.out
2414 root 20 0 3920 96 12 R 33.2 0.0 6:47.93 a.out