Docker对CPU及内存的资源限制

Dockerfile文件中CMD和EMTRYPOINT的区别

第一种:数组格式 运行一个可执行的文件并提供参数

[root@foundation40 docker]# mkdir test
[root@foundation40 docker]# cd test/
[root@foundation40 test]# vim Dockerfile
    FROM rhel7
    CMD echo "hello world!"
[root@foundation40 test]# docker build -t rhel7:v4 .
[root@foundation40 test]# docker run --rm rhel7:v4
hello world!

这里写图片描述

[root@foundation40 test]# docker run --rm rhel7:v4 echo westos
[root@foundation40 test]# docker rmi rhel7:v4

这里写图片描述

第二种:为ENTRYPOINT指定参数

[root@foundation40 test]# vim Dockerfile 
FROM rhel7
ENTRYPOINT echo "hello world!"
[root@foundation40 test]# docker build -t rhel7:v4 .
[root@foundation40 test]# docker run --rm rhel7:v4
[root@foundation40 test]# docker run --rm rhel7:v4 echo westos
[root@foundation40 test]# docker rmi rhel7:v4   #删除v4

这里写图片描述

第三种:以”/bin/sh -c”的方法执行的命令

[root@foundation40 test]# vim Dockerfile 
FROM rhel7
ENV name westos
ENTRYPOINT ["/bin/sh","-c","echo $name"]
[root@foundation40 test]# docker build -t rhel7:v4 .
[root@foundation40 test]# docker run --rm rhel7:v4

这里写图片描述


对容器CPU资源进行限制

默认情况下容器可以使用的主机 CPU 资源是不受限制的。和内存资源的使用一样,如果不对容器可以使用的 CPU 资源进行限制,一旦发生容器内程序异常使用 CPU 的情况,很可能把整个主机的 CPU 资源耗尽,从而导致更大的灾难。

1.设置允许容器占用的内存大小和swap分区大小

get stress.tar
[root@foundation40 ~]# docker load -i stress.tar 
[root@foundation40 ~]# docker run --rm -it --name vm1 -m 100M --memory-swap 100M stress --vm 1 --vm-bytes 100M
# 设置提供和给vm1的内存大小为100M,内存加交换分区的大小为100M,则能处理的最大压测也是100M

2.限制容器占用的cpu

[root@foundation40 ~]# lscpu    #查看cpu个数
[root@foundation40 ~]# docker run --rm -it --cpu-shares 512 stress -c 4
[root@foundation40 ~]# docker run --rm -it --cpu-shares 1024 stress -c 4

3.监控查看:体现优先级,1024的优先级较高

[root@foundation40 ~]# top

这里写图片描述

4.按每秒写入块设备的数据量设定上限

[root@foundation40 ~]# docker run --rm -it --device-write-bps /dev/sda:10M ubuntu
root@ec8852faa891:~# time dd if=/dev/zero of=testfile bs=1M count=20 oflag=direct

这里写图片描述


docker pause用法

[root@foundation40 ~]# docker run -it --name vm1 ubuntu
root@6a589ed56381:/#
root@6a589ed56381:/#
按ctrl+pq打入后台
[root@foundation40 ~]# docker container pause vm1   #暂停
[root@foundation40 ~]# docker ps
[root@foundation40 ~]# docker container unpause vm1   #开启

这里写图片描述
将vm1暂停后可以依旧可以看到IP,但如果将vm1 stop后,将看不到一切信息


cgroup操作

cgroup功能:

 1.限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)。

2.进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。

3.记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间

4.进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。

5.进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。

对内存进行限制

1.实验环境: RHEL6.5 172.25.40.1 server1
2.Cgroup的安装

[root@server1 ~]# yum install -y libcgroup.x86_64
[root@server1 ~]# cd /cgroup/
[root@server1 cgroup]# /etc/init.d/cgconfig start
[root@server1 cgroup]# ls
blkio  cpu  cpuacct  cpuset  devices  freezer  memory  net_cls
[root@server1 memory]# vim /etc/cgconfig.conf 
添加:  28 group x1 {
     29         memory {
     30                 memory.limit_in_bytes = ;
     31         }
     32 }
[root@server1 memory]# free -m    #查看内存情况

这里写图片描述

[root@server1 memory]# vim /etc/cgconfig.conf 
     memory.limit_in_bytes = 209715200;    #bytes=1024*200*1024
[root@server1 memory]# cd
[root@server1 ~]# /etc/init.d/cgconfig restart
[root@server1 shm]# dd if=/dev/zero of=file1 bs=1M count=100
[root@server1 shm]# free -m

这里写图片描述

[root@server1 shm]# free -m
[root@server1 shm]# dd if=/dev/zero of=file1 bs=1M count=300
[root@server1 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file1 bs=1M count=300
[root@server1 shm]# free -m

这里写图片描述

[root@server1 ~]# vim /etc/cgconfig.conf 
group x1 {
        memory {
                memory.limit_in_bytes = 209715200;   #200*1024*1024=209715200 限200M
                memory.memsw.limit_in_bytes = 209715200;       
                 # 限制内存和交换分区的大小之和,即交换分区的大小为0,可以分别打开交换分区和注释交换分区来做测试 
        }
}
[root@server1 ~]# /etc/init.d/cgconfig restart

3.进行压力测试

[root@server1 ~]# free -m
[root@server1 ~]# rm file1 
rm: remove regular file `file1'? y
[root@server1 ~]# cd /dev/shm
[root@server1 shm]# cgexec -g memory:x1 dd if=/dev/zero of=file1 bs=1M count=300

这里写图片描述


执行脚本对内存限制:

下载脚本 memapp1 memapp2 两个均为 4096 pages of memory (1个pages of memory = 4字节) 加执 行权限,现令memapp1可以执行,memapp2不可以

[root@server1 shm]# cd
[root@server1 ~]# ls
memapp1  memapp2
[root@server1 ~]# chmod +x memapp*
[root@server1 ~]# ./memapp1
[root@server1 ~]# yum install -y /lib/ld-linux.so.2
[root@server1 ~]# ./memapp1
[root@server1 ~]# ./memapp2

这里写图片描述

[root@server1 ~]# vim /etc/cgconfig.conf 
 30                 memory.limit_in_bytes = 20480000;
 31                 memory.memsw.limit_in_bytes = 20480000;
[root@server1 ~]# /etc/init.d/cgconfig restart
[root@server1 ~]# useradd haha
[root@server1 ~]# cd /dev/shm/
[root@server1 shm]# rm -fr file1
[root@server1 shm]# vim /etc/cgrules.conf 
haha:memapp1    memory          x1/
haha:memapp2    memory          x1/     ##限制任何人在执行这两个脚本时,都遵循x1里的限制
[root@server1 shm]# /etc/init.d/cgred start
[root@server1 shm]# cd
[root@server1 ~]# mv * /home/haha/
[root@server1 ~]# su - haha
[haha@server1 ~]$ ls
[haha@server1 ~]$ ./memapp1
[haha@server1 ~]$ ./memapp2

这里写图片描述


限制cpu的使用

优先级区间19 ~ -20 ,19为最低优先级
1.修改配置文件,对CPU的资源进行限制

[root@server1 ~]# vim /etc/cgconfig.conf 
添加: group x2 {
          cpu{
                cpu.shares = 100;    #优先级设为100,小于默认的1024
          }
      }
[root@server1 ~]# /etc/init.d/cgconfig restart

2.占用cpu

[root@server1 ~]# cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &
[1] 6897
[root@server1 ~]# cd /sys/
[root@server1 sys]# cd devices/
[root@server1 devices]# cd system/
[root@server1 system]# cd cpu/
[root@server1 cpu]# ls
cpu0  cpufreq  cpuidle  kernel_max  offline  online  possible  present

3.进行压力测试 只有一个资源在占用cpu

这里写图片描述


IO资源限制

1.编辑配置文件,对块设备的读写速度进行限制

[root@server1 ~]# cd /cgroup/blkio/
[root@server1 blkio]# ll /dev/vda   #查看块设备的信息
brw-rw---- 1 root disk 252, 0 Aug 21 15:01 /dev/vda
[root@server1 blkio]# vim /etc/cgconfig.conf
group x3 {
        blkio {
                blkio.throttle.read_bps_device="252:0 1000000";    # 252:0是/dev/vda这个块设备的信息
        }
}
[root@server1 blkio]# cd
[root@server1 ~]# /etc/init.d/cgconfig restart
[root@server1 ~]# cgexec -g blkio:x3 dd if=/dev/vda of=/dev/null &    # 在/dev/vda上读数据,查看速度

2.进行压力测试,用监控查看io的负载情况:
这里写图片描述


限制freezer

1.编辑配置文件,允许对进程的状态进行改变

[root@server1 ~]# vim /etc/cgconfig.conf 
    group x4 {
            freezer {}
    }
[root@server1 ~]# /etc/init.d/cgconfig restart
[root@server1 ~]# cd /cgroup/
[root@server1 cgroup]# cd freezer/
[root@server1 freezer]# cd x4
[root@server1 x4]# ps ax
 6897 pts/0    R     31:45 dd if=/dev/zero of=/dev/null
[root@server1 x4]# echo 6897 > tasks

2.当我们利用截取命令之后,发现系统的CPU立即被消耗至大致百分之百

[root@server1 x4]# cat freezer.state
THAWED       #活跃状态 
[root@server1 x4]# echo FROZEN > freezer.state   #冻结状态

3.进行压力测试,用监控查看已经没有dd的进程
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Argued_D/article/details/81905405