Docker关于cpu,内存,硬盘的管理

docker所创建的容器使用cgroup来分配资源

[root@server4 ~]# cd /
[root@server4 /]# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
#默认是看不到cgroup这个目录的。

yum install -y libcgroup
/etc/init.d/cgconfig start  #开启之后会出现cgroup这个目录
[root@server4 /]# ls
bin  cgroup  etc   lib    lost+found  mnt  proc  sbin     srv  tmp  var
boot  dev     home  lib64  media       opt  root  selinux  sys  usr

cpu的控制

vim /etc/cgconfig.conf 
group x1 {
        cpu {
                cpu.shares = 100;         #表示子控制优先级为100
        }
}
[root@server4 cgroup]# /etc/init.d/cgconfig resart
#在cpu.shares文件中,可以对进程调度程序所处理的进程组设置CPU时间分配的比重

 

cat cpu.shares
100

 由图片可以看见父控制的cpu时间分配值为1024,子控制的cpu时间分配值为100

给server4添加两个cpu:

使用 lscpu 可以用来查看cpu个数

测试两个cu的使用情况:
 

[root@server4 ~]# dd if=/dev/zero of=/dev/null &

 只有一个cpu正在被使用

[root@server4 ~]# dd if=/dev/zero of=/dev/null &

 

此时可以看见两个cpu同时工作,各自处理一条请求。

 此时主机总共两颗cpu,其中cpu0为原本的cpu,cpu1为新添加的cpu,新添加的cpu依次命名,其中,添加的cpu是可以停用的

 可以看见新添加cpu默认是打开的。
此时运行两条命令:dd if=/dev/zero of=/dev/null &
可以看见:

两条命令分别运行在一个cpu上。

停用cpu1,再次top查看:

可以发现两条命令在同一个cpu上运行。

查看子控制组x1对cpu0的控制:

关掉cpu1,可以看见使用子控制来管理运行在cpu上的服务时,cpu时间分配值小的占用cpu更少

冻结进程:
有些进程对cpu的消耗特别大,但是又不能kill掉,避免对其他进程的影响,应该冻结。

vim /etc/cgconfig.conf 
group x1 {
        freezer {
                }
}
[root@server4 cgroup]# /etc/init.d/cgconfig resart

 

冻结进程:

 可以看见进程冻结后,不再消耗cpu资源。
使用命令:ps ax 可以看见进程被冻结:

对内存的控制

分离出200M内存进行控制演示:

vim /etc/cgconfig
group x1 {
        cpu {
                cpu.shares = 100;
        }

        memory {
                memory.limit_in_bytes = 209715200;  #指定控制的内存大小为200M,如果只有此参数,在使用控制的内存超过200M时,会使用swap分区来顶替
                memory.memsw.limit_in_bytes = 209715200;  #限制所控制的内存和swap分区全部加起来为200M
        }
}
[root@server4 ~]# /etc/init.d/cgconfig restart

 [root@server4 ~]# cd /dev/shm/ #一定要在此目录下执行以下命令

 

可以看出未使用子控制系统x1时,可以随意的耗费内存。

 

 使用x1控制时,可以看出最多耗费的内存不能超过200M。

利用内存控制对应用的访问:

        cpu {
                cpu.shares = 100;
        }

        memory {
                memory.limit_in_bytes = 20480000;
                memory.memsw.limit_in_bytes = 20480000;
        }
}
[ly@server4 ~]$ vim /etc/cgrules.conf 
ly:memapp2                      memory          x1/
ly:memapp1                      memory          x1/



[ly@server4 ~]$ /etc/init.d/cgconfig restart
[ly@server4 ~]$ /etc/init.d/cgred restart

#本地测试
[root@server4 shm]# cgexec -g memory:x1 /home/ly/memapp2

Process ID is: 1147

Grabbing 8192 pages of memory
Killed
[root@server4 shm]# cgexec -g memory:x1 /home/ly/memapp1

Process ID is: 1148

Grabbing 4096 pages of memory

Success!

#切换到用户
[root@server4 shm]# su - ly
[ly@server4 ~]$ ./memapp1 

Process ID is: 1169

Grabbing 4096 pages of memory

Success!

Press any key to exit

[ly@server4 ~]$ ./memapp2

Process ID is: 1170

Grabbing 8192 pages of memory
Killed

猜你喜欢

转载自blog.csdn.net/u010489158/article/details/81915711