文章目录
- 前言:
- 一、Docker CPU控制
- 1.1 Cpu资源资源查询目录
- 1.2 cpu使用率限制
- 1.3 设置容器的权重
- 1.4 指定容器使用的CPU
- 二、docker MEM内存使用限制
- 三、docker IO限制
- 总结
前言:
cgroup是control group的简写,是Linux内核提供的一种限制所使用物理资源的机制,这些资源主要包括CPU、内存、blkio。Docker就是采用cgroup来控制容器对操作系统资源的使用。本篇博客暂只介绍部分控制方法。
一、Docker CPU控制
1.1 Cpu资源资源查询目录
- 先下载镜像、创建容器,作为备用
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1d4e1a8f977f centos:7 "/bin/bash" 10 seconds ago Up 8 seconds test1
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest e791337790a6 2 days ago 127MB
centos 7 5e35e350aded 5 months ago 203MB
- CPU资源查询目录
[root@docker ~]# cd /sys/fs/cgroup/cpu/docker/
- 查看cpu限制情况
[root@docker docker]# cd 1d4e1a8f977f9b2caf42845db94c1c32b5862969b218aa7c575d234b40eafe0d/
[root@docker 1d4e1a8f977f9b2caf42845db94c1c32b5862969b218aa7c575d234b40eafe0d]# ls
cgroup.clone_children cpuacct.usage cpu.rt_period_us notify_on_release
cgroup.event_control cpuacct.usage_percpu cpu.rt_runtime_us tasks
cgroup.procs cpu.cfs_period_us cpu.shares
cpuacct.stat cpu.cfs_quota_us cpu.stat
[root@docker 1d4e1a8f977f9b2caf42845db94c1c32b5862969b218aa7c575d234b40eafe0d]# cat cpu.cfs_quota_us
-1
#-1(默认值,代表此容器可以使用的资源是不受限制,只受硬件瓶颈限制)
cpu 周期:1s为一个周期的定律,参数值一般为100000(CPU衡量单位是秒)
假如需要给此容器分配cpu使用率的20%,则参数需要设置为20000,相当于每个周期分配给这个容器0.2s
cpu 在一个时刻,只能给一个进程占用
1.2 cpu使用率限制
- 方式一:命令控制,在容器创建的时候进行设置,假如设置参数20000
[root@docker ~]# docker run -itd --name test2 --cpu-quota 20000 centos:7 /bin/bash
e382799738838363f13e66d6e2855111b308edeb71af1074cdc6cdccdca2b8e1
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e38279973883 centos:7 "/bin/bash" 7 seconds ago Up 5 seconds test2
1d4e1a8f977f centos:7 "/bin/bash" 14 minutes ago Up 14 minutes test1
- 压力测试验证cpu控制结果
- 另起一个终端,执行top 动态查询信息
#进入容器
[root@docker ~]# docker exec -it e38279973883 /bin/bash
[root@e38279973883 /]# yum install bc -y
......省略部分内容
#执行命令计算圆周率
[root@e38279973883 /]# echo "scale=5000;4*a(1)" | bc -l -q
- 方式二:直接修改配置参数
[root@docker 1d4e1a8f977f9b2caf42845db94c1c32b5862969b218aa7c575d234b40eafe0d]# echo "20000" > 1d4e1a8f977f9b2caf42845db94c1c32b5862969b218aa7c575d234b40eafe0d
1.3 设置容器的权重
- 按比例分配 设置容器权重,此处权重是所有值相加然后看占用百分比
- 示例:
[root@docker ~]# docker run -itd --name c1 --cpu-shares 512 centos:7 /bin/bash
[root@docker ~]# docker run -itd --name c2 --cpu-shares 1024 centos:7 /bin/bash
#先创建俩个容器,同时设置权重
- 查看容器资源占用情况
[root@docker ~]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
3e85fc6a8e03 c2 0.00% 392KiB / 1.779GiB 0.02% 729B / 0B 0B / 0B 1
aa6949aca032 c1 0.00% 396KiB / 1.779GiB 0.02% 2.71kB / 0B 0B / 0B 1
#docker stats 和top一样也是动态显示
- 使用压测工具测试
- 复制两个终端,登录后安装压测工具进行测试,主界面保持docker stats动态查看
#进入两个终端,安装epel源和压测工具
[root@docker ~]# docker exec -it 3e85fc6a8e03 /bin/bash
[root@3e85fc6a8e03 /]#
[root@3e85fc6a8e03 /]# yum install epel-release -y
.....省略部分内容
[root@3e85fc6a8e03 /]# yum install stress -y
.....省略部分内容
- 以上操作在两个容器中进行
- 压测实验,分别在两个容器中同时使用压测工具模拟产生4个cpu线程,然后查看主终端的状态观测
[root@aa6949aca032 /]# stress -c 4
1.4 指定容器使用的CPU
- 环境:添加cpu核心,现有4个内核
- 先清空现有的容器
[root@docker ~]# docker ps -a | awk '{print "docker rm "$1}'| bash
- 创建容器、指定使用的CPU
- 使用top动态观测cpu使用状态
- 这里指定cpu 1,3 表示指定使用第二、第四个cpu
[root@docker ~]# docker run -itd --name test1 --cpuset-cpus 1,3 centos:7 /bin/bash
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e53d3e2d5f49 centos:7 "/bin/bash" 5 seconds ago Up 4 seconds test1
[root@docker ~]# top
- 另起终端,进入容器,安装压测工具
[root@docker ~]# docker exec -it e53d3e2d5f49 /bin/bash
[root@3e85fc6a8e03 /]# yum install epel-release -y
.....省略部分内容
[root@3e85fc6a8e03 /]# yum install stress -y
.....省略部分内容
[root@e53d3e2d5f49 /]# stress -c 4
#查看主终端top中cpu使用状态
二、docker MEM内存使用限制
- 设置交换分区的上限值
[root@docker ~]# docker run -itd --name test2 -m 512m centos:7 /bin/bash
- 查看cpu状态
[root@docker ~]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
9ee75d275f96 test2 0.00% 3.641MiB / 512MiB 0.71% 648B / 0B 0B / 0B 1
e53d3e2d5f49 test1 0.00% 796KiB / 1.779GiB 0.04% 23.1MB / 162kB 0B / 0B 2
- 可以观测到test2容器做了限制之后 内存使用上线为512M 而之前创建的test1容器则不受限制(硬件限制)
三、docker IO限制
- docker 的IO限制就是对block的IO进行约束
- 控制数据量用的较多,其中控制IO次数使用的较少,命令如下:
- ① --device-read-bps :限制读某个设备的bps(数据量),示例:
[root@docker ~]# docker run -itd --device-read-bps /dev/sda:30M centos:7 /bin/bash
- ② --device-write-bps:限制写入某个设备的bps(数据量)示例:
[root@docker ~]# docker run -itd --device-write-bps /dev/sda:30M centos:7 /bin/bash
- ③ --device-read-iops 限制读某个设备的iops(次数)
- ④ --device-write-iops 限制写入某个设备的iops(次数)
总结
cpu资源控制在生产环境中是基础也是很重要的一环,后续将继续更新docker的相关内容