docker 资源控制

Docker的资源控制

对容器使用宿主机的资源进行限制,如cpu,内存,磁盘I/O

Docker使用linux自带的功能cgroup(control grouos)是linux内核系统提供的一种可以限制,记录,隔离进程组使用的物理资源

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

Cgroup本身是提供将进程分组化管理的功能和接口的基础结构,分配控制的机制来实现资源控制

cpu资源控制

linux通过CFS(Completely Fair Scheduler 完全公平调度器),来调度各个进程之间对cpu的使用。CFS的调度100ms,我们也可以自定义容器的调度周期,以及在这个周期时间之内各个容器能够使用cpu的调度时间
--cpu-period 设置容器调度cpu的周期,只能在容器创建的时候使用
--cpu-quota 设置在每个周期内,容器可以使用cpu的时间,只能在容器创建的时候使用

可以配合使用

CFS周期的有效范围是1ms-1s ,也就是1000~1000000

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

cd /sys/fs/cgroup/cpu/docker/07a4683b9aee2363decbbafcc29e4abed2e5aa6aab8b72807f1ebfda
cat cpu.cfs_period_us
100000
CFS表示调度周期的长度,以微妙为单位,每个周期内,容器可以使用指定比例的cpu时间,默认情况的值是100000,也就是100毫秒

cat cpu.cfs_quota_us
-1
如果配置是-1,那么容器在使用宿主机cpu的时间将不做任何限制
如果设为正值,表示在周期内的配额
如果cpu.cfs_quota_us设置为50000,那么容器在一个周期内最多可以使用50毫秒的cpu时间

CFS调度器,100毫秒就是定义了一个周期,在这个周期之内,调度任务(容器)的基本时间单位,100毫秒一次调度容器请求cpu的资源,然后内核把cpu资源分配给容器

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

如何控制容器使用cpu的时间进行限制

docker exec -it test1 bash

vim cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done

压力测试脚本
[root@docker1 ~]# top

[root@docker1 opt]# docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash
[root@docker1 opt]# docker restart test6
[root@docker1 opt]# docker exec -it test6 bash
[root@181456d16a59 opt]# vi /opt/cpu.sh
[root@181456d16a59 opt]# ./cpu.sh

或者
cd /sys/fs/cgroup/cpu/docker/3ed82355f81151c4568aaa6e7bc60ba6984201c
echo 50000 > cpu.cfs_quota_us
docker exec -it 3ed82355f811 /bin/bash
./cpu.sh
可以看到cpu占用率接近50%,cgroups对cpu的控制起了效果,如下图

如何设置cpu资源占用权重比?需要多个容器才能生效

--cpu-shares
指定容器占用cpu的份额
默认权重是1024,设置的值只能是1024的倍数
[root@docker1 opt]# docker run -itd --name test2 --cpu-shares 512 centos:7 /bin/bash
[root@docker1 opt]# docker run -itd --name test3 --cpu-shares 512 centos:7 /bin/bash
[root@docker1 opt]# docker exec -it test2 bash
[root@docker1 ~]# docker exec -it test3 bash
[root@b043c8c8c29c /]# yum -y install epel-release
[root@b043c8c8c29c /]# yum -y install stress
下载模拟系统负载的工具
[root@b043c8c8c29c /]# stress -c 4
在宿主机查看
[root@b043c8c8c29c /]# exit
[root@docker1 opt]# docker stats
不加容器名就是显示所有容器占用情况

--cpu-shares指定容器占用cpu的份额,模式权重1024,设置的值只能是1024的倍数

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

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

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

Docker exec -it test5 bash

Yum -y install epel-reles

Strees -c 4

容器占用cpu的时间

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

容器占用cpu的内核数,绑定指定cpu内核给容器使用。

内存:如何限制容器对内存的使用

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

创建3个容器分别对三个容器进行资源限制,占用时间

Centos1 占用  cpu的时间10000,占用cpu的权重256 占用内存 1G  

Centos2 占用 cpu时间为20000,占用权重 512 占用内存 2G

Centos3占用cpu时间为30000,占用权重1024 占用内存512m

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

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

如果说限制了内存是512 ,swap是1g,那么test容器能够使用的swap空间=1g-512m

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

如果设置 --memory-swap的值和内存限制一样,容器不能使用swap空间

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

磁盘 i/O配额

限制容器再磁盘上的读速度:docker run -itd --name test8 --device-read-bps /dev/sda:1M centos:7 /bin/bash

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

Docker run -itd --name test9 --device-write-bps /dev/sda:1mb centos:7 /bin/bash

Dd if=/dev/zero of-123.txt bs=1M count=10

Dd if=/dev/zero of-123.txt bs=1M count=10 oflag=direct

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

限制容器读取的次数:docker run-itd --name test10 --device-read-iops /dev/sda:100 centos:7 /bin/bash

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

限制容器写入设备的次数:docker run -itd --name test10 --write-iops /dev/sda:50 centos:7 /bin/bash

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

如何清理docker占用的磁盘空间

Df -h

Docker system prune -a

删除已经停止的容器

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

删除所有未被使用的镜像

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

总结

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

3种限制方式:容器占用cpu的时间,容器占用cpu的权重,容器绑定cpu指定使用cpu

怎么对宿主机的内存使用限制

-m

-swap:必须和限制内存一块使用 swap要减去内存数值才是swap的使用

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-09 00:24:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-09 00:24:05       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-09 00:24:05       82 阅读
  4. Python语言-面向对象

    2023-12-09 00:24:05       91 阅读

热门阅读

  1. 顺序查找(数据结构实训)

    2023-12-09 00:24:05       56 阅读
  2. 第56天:django学习(五)

    2023-12-09 00:24:05       55 阅读
  3. using meta-SQL 使用元SQL 六

    2023-12-09 00:24:05       44 阅读
  4. 鸿蒙(HarmonyOS)应用开发——管理组件状态

    2023-12-09 00:24:05       61 阅读
  5. TensorRT-LLM保姆级教程(一)-快速入门

    2023-12-09 00:24:05       63 阅读