docker是基于Linux CGroup来控制进程对资源利用的限制及追踪;那什么是CGroup呢?
CGroup(Contral Group) 是 Linux 中将进程按组进行系统资源分配和控制的机制;主要作用包括限制资源的使用、优先级控制、审计与统计、挂起及恢复进程;CGroup可以对docker限制的资源包括 CPU、内存、磁盘;
1、docker容器限制CPU;
使用docker run --help 可以看到对CPU资源做限制的命令如下:
命令 | 说明 |
--cpu-period int | 限制 CPU 完全公平调度周期 |
--cpu-quota int | 限制 CPU 完全公平调度配额(绝对权重) |
--cpu-rt-period int | 限制 CPU 实时时间段(以微秒为单位) |
--cpu-rt-runtime int | 限制 CPU 实时运行时间(以微秒为单位) |
--cpu-shares int | 指定CPU 份额(相对权重) |
--cpus decimal | 指定CPU核心数 |
--cpuset-cpus string | 指定允许使用的CPU,值可以为 0-3,0,1 |
--cpuset-mems string | 指定允许使用的内存节点,值可以为0-3, 0,1 |
1.1.cpu-period
通俗来说,是指定容器对CPU的使用在多长时间内重新做一次分配,单位为微秒(μs),范围在1ms-1s之间,也就是[1000, 1000000],默认为0.1s(100000μs);
docker run -itd --name=nginx3 --cpu-period 200000 chililopp/nginx:v1
1.2.cpu-quota
指定在period周期内,有多少时间来运行这个容器,单位为微秒(μs),最小值为1ms(1000μs),默认值为-1,也就是不做任何控制;
docker run -itd --name=nginx4 --cpu-period 200000 --cpu-quota 10000 chililopp/nginx:v1
1.3.cpu-rt-period
cpu.rt_period_us是实时进程的周期时间,单位为微秒(μs),默认为1s(1000000μs)
docker run -itd --name=nginx5 --cpu-rt-period 200000 chililopp/nginx:v1
1.4.cpu-rt-runtime
cpu.rt_runtime_us是在一个周期时间内,实时进程占用的最大时间,单位为微秒(μs),默认是0;
docker exec -it nginx6 cat /sys/fs/cgroup/cpu/cpu.rt_runtime_us
1.5.cpu-shares
指定容器所使用的 CPU 份额值,它仅仅只是一个弹性的值,并不能保证获得 1 个 vcpu 或者多少 GHz 的 CPU 资源;实际分配的权重受到 是否有其他同时运行的容器、容器中进程运行情况的影响;cpu-shares的值默认为1024;
docker run -itd --name=nginx7 --cpu-shares 512 chililopp/nginx:v1
1.6.cpus
指定可以使用的CPU核心数量,但不能指定哪一个核心,最小为0.01
docker run -itd --name=nginx8 --cpus 1 chililopp/nginx:v1
1.7.cpuset-cpus
可以指定容器在哪些 CPU 核上运行;
docker run -itd --name=nginx10 --cpuset-cpus 0 chililopp/nginx:v1
1.8.cpuset-mems
指定允许使用的内存节点,对具有 NUMA 拓扑(具有多 CPU、多内存节点)的服务器尤其有 用,可以对需要高性能计算的容器进行性能最优的配置。
如果服务器只有一个内存节点,则-- cpuset-mems 的配置基本上不会有明显效果。 ;
docker run -itd --name=nginx11 --cpuset-mems 0 chililopp/nginx:v1
2、docker容器限制内存;
使用docker run --help可以看到,对内存资源做限制的命令如下:
命令 | 说明 |
-m, --memory bytes | 限制容器的内存使用量 |
--memory-reservation bytes | 限制内存的软性 |
--memory-swap bytes | 限制内存+交换分区总大小。 |
memory-swappiness int | 用于设置容器的虚拟内存控制行为 |
--kernel-memory bytes | 限制核心内存 |
2.1.memory bytes
对容器能使用的内存做限制,选项的参数最小为 4 M;
docker run -itd --name=nginx4 -m 6m chililopp/nginx:v1
2.2.memory-reservation
memory reservation 是一种软性机制,它不保证任何时刻容器使用的内存不会超过--memory-reservation
限定的值,它只是确保容器不会长时间占用超过--memory-reservation
限制的内存大小。
docker run -itd --name=nginx5 -m 6m --memory-reservation 6m chililopp/nginx:v1
2.3.memory-swap
是内存加交换分区的总大小,memory-swap
必须比-m,--memory大
docker run -itd --name=nginx6 -m 6m --memory-swap 7m chililopp/nginx:v1
2.4.memory-swappiness
用来设置这个交换分区和内存的使用比例的。范围为【0,100】。0 表示不使用swap。100 表示更倾向于使用swap交换。
docker run -itd --name=nginx7 -m 6m --memory-swappiness 7 chililopp/nginx:v1
2.5.kernel-memory
核心内存和用户内存不同的地方在于核心内存不能被交换出。不能交换出去的特性使得容器可以通过消耗太多内存来堵塞一些系统服务
docker run -itd --name=nginx8 -m 6m --memory-swappiness 7 --kernel-memory 4m chililopp/nginx:v1
3、docker限制磁盘IO读写;
命令 | 说明 |
--device-read-bps list | 限制容器读速度,单位可以是 kb、mb 或者 gb |
--device-read-iops list | 限制容器每秒读取IO次数 |
--device-write-bps list | 限制容器写速度,单位可以是 kb、mb 或者 gb |
--device-write-iops list | 限制容器每秒写入IO次数 |
3.1.实例:限制容器实例对硬盘的最高写入速度:
docker run -it --name=tomcat_3 -v /docker/data_volume:/data_Tomcat --device /dev/nvme0n1p3:/dev/sma --device-write-bps /dev/sma:2mb --device-read-bps /dev/sma:4mb chililopp/tomcat:v1 /bin/bash
time dd if=/dev/sma of=/data_Tomcat/etl_tomcat.zip bs=2M count=50 oflag=direct,nonblock