Docker容器 ---- 资源控制篇

前言:

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的相关内容

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值