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资源配置!的主要内容,如果未能解决你的问题,请参考以下文章
实现容器的底层技术 - 每天5分钟玩转 Docker 容器技术(30)