Docker容器之Cgroup资源配置!

Posted handsomeboy-东

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker容器之Cgroup资源配置!相关的知识,希望对你有一定的参考价值。

cgroup资源配置

cgroup是Control Groups的缩写,是Linux内核提供的一直可以限制、记录、隔离进程组所使用的物理资源,dokcer通过cgroup来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面

容器资源配置

  • 构建容器时指定资源限制参数
--build-arg=[] :
设置镜像创建时的变量;
--cpu-shares :
设置cpu使用权重;
--cpu-period :
限制CPU CFS周期;
--cpu-quota :
限制cPU CFS配额;
--cpuset-cpus :
指定使用的CPU id;
--cpuset-mems :
指定使用的内存id;
--disable-content-trust :忽略校验,默认开启;-f :
指定要使用的Dockerfile路径;
--force-rm :
设置镜像过程中册删除中间容器;
--isolation :
使用容器隔离技术;
--label=[ ] :
设置镜像使用的元数据;
-m :
设置内存最大值;
--memory-swap :
设置Swap的最大值为内存+swap, "-1"表示个/限swap;
--no-cache :
创建镜像的过程不使用缓存;
--pull :
尝试去更新镜像的新版本;
--quiet, -q :
安静模式,成功后只输出镜像工D;
--rm :
设置镜像成功后删除中间容器;
--shm-size :
设置/dev/ shm的大小,默认值是64M;
--ulimit :
Ulimit配置。
--squash :
将Dockerfile中所有的操作压缩为一层。
--tag, -t:
镜像的名字及标签,通常name: tag或者name
格式;可以在一次构建中为一个镜像设置多个标签。
--network :
默认default。在构建期间设置RUN指令的网络模式

1、CPU利用率控制

  • CPU周期:ls为一个周期的定律,参数值一般为100000(秒)
  • 用stress压力测试工具测试CPU和内存使用情况
[root@docker ~]# mkdir /opt/stress
[root@docker ~]# cd /opt/stress/
[root@docker stress]# vim Dockerfile
FROM centos:7
RUN yum install -y wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install -y stress
[root@docker stress]# docker build -t centos:stress .
##容器产生10个子函数进程,做cpu权重限制
[root@docker stress]# docker run -itd --name cpu512 --cpu-shares 512 centos:stress stress -c 10
592e3c1839d101d8c06530dbb854b3e080081d6bc8aaf275e7015f7673ffa28c
[root@docker stress]# 
##另开一个终端,在创建一个容器进行对比
[root@docker ~]# docker run -itd --name cpu1023 --cpu-shares 1024 centos:stress stress -c 10
783b4cfb91a1e5489155438a5493ccd027db142f6d8fecc92c53c6e57a7896c0
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND          CREATED          STATUS          PORTS     NAMES
783b4cfb91a1   centos:stress   "stress -c 10"   19 seconds ago   Up 18 seconds             cpu1023
592e3c1839d1   centos:stress   "stress -c 10"   23 minutes ago   Up 22 minutes             cpu512
[root@docker stress]# docke stats		#查看当前宿主机所有容器CPU和内存等信息

Docker提供了--cpu-period、--cpu-quota两个参数控制容器分配到的CPU时钟周期,单位为微秒
--cpu-period是用来指定容器对CPU的使用要在多长时间内做一次重新分配
--cpu-quota是用来指定在这个周期内,最多可以用多少时间来跑这个容器
[root@docker ~]# docker rm -f `docker ps -aq`		##清空上面开启的容器,这种方法在实际生产中慎用
783b4cfb91a1
592e3c1839d1

##设置--cpu-period为0.1秒,--cpu-quota为0.2秒
[root@docker ~]# docker run -itd --name cpu01 --cpu-period 100000 --cpu-quota 200000 centos:stress 
de934a7f89c1edee959b68fcaf3b1a1409ab94ea6c7ea1ac61b495e85daaa868
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS         PORTS     NAMES
de934a7f89c1   centos:stress   "/bin/bash"   6 seconds ago   Up 6 seconds             cpu01
[root@docker ~]# docker exec -it de934a7f89c1 /bin/bash		##进入容器查看配置结果
[root@de934a7f89c1 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us 
100000
[root@de934a7f89c1 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us 
200000

[root@docker ~]# top 	##top完按数值1可查看所有的cpu
top - 18:10:37 up 22:23,  4 users,  load average: 0.00, 1.07, 7.82
Tasks: 230 total,   2 running, 228 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

##指定容器只能用0、1两个内核,
[root@docker ~]# docker run -itd --name cpu1 --cpuset-cpus 0-1 centos:stress 
5e591e5acbe74af4743c6f831b0bd0e89073876d85661660e555bf3886714221
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS          PORTS     NAMES
5e591e5acbe7   centos:stress   "/bin/bash"   5 seconds ago    Up 4 seconds              cpu1
de934a7f89c1   centos:stress   "/bin/bash"   14 minutes ago   Up 14 minutes             cpu01
[root@docker ~]# docker exec -it 5e591e5acbe7 bash
[root@5e591e5acbe7 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-1

##创建两个容器,分别指定不同的内核,和cpu权限,对比查看
[root@docker ~]# docker run -itd --name cpu2 --cpu-shares 512 --cpuset-cpus 1 centos:stress stress -c 1
7f00b49b1d87757c8f2215bbc6648ea85b4cd7db94d6d6cb5f5e07806746469a
[root@docker ~]# docker run -itd --name cpu3 --cpu-shares 1023 --cpuset-cpus 3 centos:stress stress -c 1
587682893c4b6a104f80fdb5f32815635c3c05df2c38d4e5ac1bd23849b00ac7
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND         CREATED         STATUS         PORTS     NAMES
587682893c4b   centos:stress   "stress -c 1"   6 seconds ago   Up 5 seconds             cpu3
[root@docker ~]# docker stats		##查看容器cpu使用,不同容器使用不同cpu,其设置的权重无意义
7f00b49b1d87   centos:stress   "stress -c 1"   5 minutes ago   Up 5 minutes             cpu2
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
587682893c4b   cpu3      99.87%    120KiB / 5.651GiB   0.00%     737B / 0B   0B / 0B     2
7f00b49b1d87   cpu2      100.12%   120KiB / 5.651GiB   0.00%     737B / 0B   0B / 0B     2

2、内存限额

docker -m或者--memory 设置内存使用限额
docker --memeory-swap 设置swap使用限额
[root@docker ~]# docker run -itd -m 200M --memory-swap=300M centos:stress 
[root@docker ~]# docker stats			##查看设置结果
c99558b808e9029d53cc439c79ce9846e8e64e345926e9d5104d1da2a7e94cc5
CONTAINER ID   NAME           CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
c99558b808e9   stoic_bhabha   0.00%     396KiB / 200MiB     0.19%     656B / 0B   0B / 0B     1
  • Block IO
--blkio-weight 参数可以改变容器block IO的优先级,默认为500
[root@docker ~]# docker run -it --name container_a --blkio-weight 600 centos:stress
[root@9bea566d8268 /]# cat /sys/fs/cgroup/blkio/blkio.weight		##查看修改
600

##bps和iops限制
bps:byte per second :每秒读写的数据量
iops:io per second :每秒IO的次数
--device-read-bps		#限制读某个设备的bps
--device-write-bps		#限制写莫格设备的bps
--device-read-iops		#限制读某个设备的iops
--device-write-iops		#限制写某个设备的iops
[root@docker ~]# docker run -it --device-write-bps /dev/sda:5MB centos:stress
[root@12b9a7dc32be /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
^C27+0 records in					##ctrl+c中断查看
27+0 records out
28311552 bytes (28 MB) copied, 5.40251 s, 5.2 MB/s
[root@12b9a7dc32be /]# exit                        
[root@docker ~]# docker run -it centos:stress		##不做限制查看速度
[root@79486127aa12 /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
^C622+0 records in
622+0 records out
652214272 bytes (652 MB) copied, 0.47992 s, 1.4 GB/s

总结

  • 资源限制主要类型:CPU、磁盘、内存、IO
  • 资源限制方式:构建镜像时指定镜像资源限制,构建容器时指定容器的资源限制,容器启动后在宿主机对应容器目录下修改资源限制
  • 资源限制查询:docker inspect 镜像ID/容器ID,或者直接查看宿主机对应容器ID资源限制文件(/sys/fs/cgroup/*)

以上是关于Docker容器之Cgroup资源配置!的主要内容,如果未能解决你的问题,请参考以下文章

Docker容器之Cgroup资源配置!

Docker容器之Cgroup资源配置!

Cgroup--资源限额

实现容器的底层技术 - 每天5分钟玩转 Docker 容器技术(30)

实现容器的底层技术 - 每天5分钟玩转 Docker 容器技术(30)

实现容器的底层技术 - 每天5分钟玩转 Docker 容器技术(30)