docker的资源控制:

对容器使用宿主机的资源进行限制。

cpu 内存 磁盘i

docker 使用linux使用linux自带的功能cgroup

control grouos是linux内核系统提供的一种可以限制,记录,隔离进程组所使用的物理资源的机制。

docker借助这个机制,来实现资源的控制

cgroup 本身是将进程进行分组化隔离的功能和接口的基础结构。分配控制的机制来实现资源控制。

host:容器和宿主机共用一个网络命名空间

container:容器和容器之间共用一个网络命名空间。其他的资源依然是隔离的。

一,CPU 资源控制:

1,容器对cpu的占用时间限制

linux通过CFS(completely Fair Sxheduler 完全公平调度器),来调度各个进程对cpu的使用。CFS的调度100ms

我们也可以自定义容器的调度周期。以及在这个周期之内各个容器能够使用cpu的调度时间。

–cpu-period 设置容器调度cpu的周期

–cpu-quota 设置在每个周期内,容器可以使用cpu的时间。

可以配合使用

CFS周期的有效范围:1ms-1s –cpu-period 1000~1000000

容器使用cpu的配额时间必须大于1ms,–cpu-quota的值,必须是>=1000

docker run -itd –name test1 centos:7 /bin/bash

查看配置文件

cd /sys/fs/cgroup/cpu/docker

cat cpu.cfs_period_us

100000

CFS调度周期的长度,微秒,在这个周期内使用自带比例的cpu时间。默认情况都是100毫秒

100毫秒就是定义了一个周期,在这个周期内,调度任务(容器)的基本时间单位。

100毫秒-次调度容器请求cpy的资源。 然后内核把cpu资源分配给容器。

cpu.cfs quota. _us: 调度请求之后,根据配额,内核分配给容器使用gpy的时间。

cat cpu.cfs_quota_us

-1

如果配置是-1,那么容器在使用cpu的的时间不做限制

调度请求之后,根据配额,内核分配给容器使用cpu的时间。

进入:docker exec -it test1 bash

写一个脚本:cd /opt vim cpu.sh

yum -y install vim

vim cpu.sh

chmod 777 cpu.sh

再开一个会话:查看

docker stats test1/id 可以容器的运行占用宿主机资源的情况

docker top test1/id 查看容器内PID和宿主机pid的映射关系。

对进程进行限制:

修改配置文件

cd /sys/fs/cgroup/cpu

在创建的时候直接设置:

docker run -itd –name test2 –cpu-quota 40000 centos:7 /bin/bash

vim /cpu.sh

#!/bin/bash

i=0

while true

do

let i++

done

chmod +x /cpu.sh

./cpu.sh

2,设置容器占用cpu的权重比:协议多个容器才能生效。

–cpu-shares 指定容器占用cpu的份额,

是给每个容器使用cpu设置了相对的权重,权重高的,可以使用cpu的资源更多,但是,如果只有一个容器在运行,即使设置了权重,但是没有其他权重高的权重的容器来占用资源,权重第的容器不受影响。

docker run -itd –name test3 –cpu-shares 512 centos:7 /bin/bash

docker run -itd –name test4 –cpu-shares 1024 centos:7 /bin/bash

设置的权重高,占用比就高

进入第一个

安装测试工具

分别进入容器,进行压力测试

yum install -y epel-release

yum install -y stress

stress -c 4

查看容器运行状态(动态更新)

docker stats

3,设置容器绑定cpu,容器只能使用指定的cpu内核

docker run -itd –name test5 –cpuset-cpus 1,3 centos:7 /bin/bash

面试题:如何对CPU 进行资源控制

1,容器占用gpu的时间

2,容器占用gpu的权重比(多个容器时,才有效)

3,容器占用cpy的内核数,绑定指定gpu内核给容器使用。

二,容器对内存使用的限制:

1,创建时进行限制

docker run -itd –name 镜像名 -m 内存大小 镜像名:标签 /bin/bash

docker run -itd –name test6 -m 512m centos:7 /bin/bash

2,限制使用swap:想要限制容器使用swap。必须和限制内存一块使用

docker run -itd –name 容器名 -m 内存大小 –memory-swap=swap大小 镜像名:标签 /bin/bash

docker run -itd –name test7 -m 512m –memory-swap=1g centos:7 /bin/bash

如果限制了内存是512,swap是1G,那么容器实际上能够使用swap空间,1g-512m

swap使用的是1g-512G

如果限制了内存是512,swap是1G,那么容器实际上能够使用swap空间,1g-512m=512m

如果不设置: -m 512m但是使用swap的空间是-m的两倍

如果设置–memory-swap的值,和内存限制-样,容器就不能使用swap.

如果-m 512m –memory-swap–1, 内存受限还是512M,但是容器使用swap空间不再限制。

三,磁盘I/O配置:

读:

写:

限制容器在磁盘上的读速度:

docker run -itd –name test8 –devic-read-bps /dev/sda:1M centos:7 /bin/bash

写:

docker run -itd –name test8 –devic-write-bps /dev/sda:1mb centos:7 /bin/bash

做了限制还是没用要加一个命令:

oflag=direct

在使用dd获取空字符集是从文件系统的缓存当中输入,速度是比较快的,禁用文件系统缓存,直接把数据写入磁盘,可以更真实的测试设备的性能,模拟直接写入物理设备的情况。

限制容器读取的次数

docker run -itd –name test10 -device-read iops /dev/sda:100 centos:7 /bin/bash

限制读取操作,每秒是100次

限制容器写入的次数

docker run -itd –name test11 –device-write-iops /dev/sda:50 centos:7 /bin/bash

限制写入的操作,每秒是50次

四,清理docker磁盘占用的空间

docker system prune -a

会删除以及停止的容器,

删除所有未被使用的网桥设备

删除所有未被使用的镜像

删除创建容器时的缓存,以及无用的数据卷。

总结:

怎么对容器使用cpu进行限制:

容器占用cpu的时间

容器占用cpu的权重

容器绑定cpu

容器对宿主机的内存使用限制:

-m

swap:必须和限制内存一块使用。

-m 512m –memory-wap=1g

-m 512m –memory-wap=512m

-m 512m

1024m

-m 512m –memory-wap=-1

磁盘i/o