docker容器资源控制和管理 Cgroup 老司机带你急速上手(:=)


Cgroups

  • 其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。

  • 这个项目最早是由Google的工程师(主要是Paul Menage和Rohit Seth)在2006年发起,最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词有许多不同的意义,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去。自那以后,又添加了很多功能。

  • 被 LXC、docker 等很多项目用于实现进程资源控制。Cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理是通过该功能来实现的。

  • 这些具体的资源 管理功能称为 Cgroup 子系统,有以下几大子系统实现:

blkio: 设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及 usb 等等。

CPU: 使用调度程序为 cgroup 任务提供 CPU 的访问。

cpuacct: 产生 cgroup 任务的 CPU 资源报告。

cpuset: 如果是多核心的 CPU,这个子系统会为 cgroup 任务分配单独的 CPU 和 内存。

devices: 允许或拒绝 cgroup 任务对设备的访问。

freezer: 暂停和恢复 cgroup 任务。

memory: 设置每个 cgroup 的内存限制以及产生内存资源报告。

net_cls: 标记每个网络包以供 cgroup 方便使用。

ns: 命名空间子系统。

perf_event: 增加了对每个 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程以及运行在特定CPU上的线程。

先利用dockerfile为测试部署一个stress镜像,可以利用stress压力测试工具为容器增加负载 方便观察限制和策略的效果

cd
mkdir stress
cd stress
vim Dockerfile
FROM centos:7
MAINTAINER chen "chen@kgc.com"
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
保存退出
docker build -t stress:centos .
docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
stress                      centos              a484f14c64c5        32 hours ago        417MB

限制容器使用CPU资源

使用share限制容器

 docker run -tid --name cpu-1 --cpu-shares 512 stress:centos stress -c 10
 # --cpu-shares 512 为权重512
 # stress -c 10 为增加10个子函数进程的负载
 docker run -tid --name cpu-2 --cpu-shares 1024 stress:centos stress -c 10

此时的cpu-1和cpu-2的权重是1:2 所以进入容器之后查看容器cpu的占有率应该也是1:2
cpu-1
在这里插入图片描述
cpu-2
在这里插入图片描述

CPU周期限制容器

Docker 提供了–cpu-period、–cpu-quota 两个参数控制容器可以分配到的 CPU 时钟周期。
–cpu-period 是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配。
–cpu-quota 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。
与 --cpu-shares 不同的是,这种配置是指定一个绝对值,容器对 CPU 资源的使用绝对不会超过配置的值。
大致可以理解为
cpu-period 和 cpu-quota 的单位为微秒(μs)。cpu-period 的最小值为 1000 微秒, 最大值为 1 秒(10^6 μs),默认值为 0.1 秒(100000 μs)。
cpu-quota 的值默认为 -1 表示不做控制
cpu-period 和 cpu-quota 参数一般一起使用

docker run -tid --name cpu-4 --cpu-period 100000 --cpu-quota 200000 stress:centos stress -c 10 
docker exec -it cpu-4 bash
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us #在容器中查看period值
100000
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us #在容器中查看quota值
200000

使用CPU core分配核心

cpu-core是针对服务器cpu核心的控制
通过 cpuset-cpus 参数指定容器 A 使用 CPU 内核 0,容器 B 只是用 CPU 内核 1。

docker run -tid --name cpu-6 --cpuset-cpus 0 stress:centos stress -c 10
docker exec -it cpu-6 bash
top

在这里插入图片描述
如果在主机上只有这两个容器使用对应 CPU 内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果。
在这里插入图片描述

限制容器使用内存资源

使用–memory管理内存和swap的占用

默认情况下,容器可以使用主机上的所有空闲内存,但是使用memory和swap可以限制容器的使用内存的上线和溢出的内存使用swap的大小。

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

限制使用内存的大小为200mb 内存+swap的总大小不超过300mb
然后运行一个内存工作线程 使运行内存占用280mb 如果超过300m会导致stress线程报错退出
运行280mb的效果
在这里插入图片描述
运行310mb的效果
在这里插入图片描述

限制容器使用磁盘读写资源

使用Block IO 的限制容器的磁盘占用

Block IO和share的权重限制一样 都是分配权重值,来通过对撞的方式使其中的一个队读写要求比较高的容器获取更多的磁盘读写资源,不过该策略在2个容器的在读写的需求上没有满载争抢资源的情况下 观察不明显
默认容器的Block IO权重是500

docker run -it --name container_A --blkio-weight 600 centos:stress

可以通过配置文件查看当前的权重值

cat /sys/fs/cgroup/blkio/blkio.weight
600

通过指定bps 和 iops 的限制
bps 是 byte per second,每秒读写的数据量。
iops 是 io per second,每秒 IO 的次数。
可以指定容器对哪个存储设备的最大读写量和IO次数
命令如下:

  • –device-read-bps,限制读某个设备的 bps。
  • –device-write-bps,限制写某个设备的 bps。
  • –device-read-iops,限制读某个设备的 iops。
  • –device-write-iops,限制写某个设备的 iops。

docker run -it --device-write-bps /dev/sda:5MB centos:stress
效果如下
在这里插入图片描述
如果不做限制
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值