Docker的资源控制

2023-12-13 03:43:28

Docker的资源控制:

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

CPU 内存 磁盘I/O(读写性能)

docker使用linux自带的功能cgroup

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

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

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

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

container:容器和容器之间共用一个网络命名空间。

其他的资源依然是隔离的。

隔离是基础

1、CPU资源控制:

Linux通过CFS(Completely Fail Scheduler 完全公平调度器),来调度各个进程对CPU的使用。CFS的调度周期为100ms。

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

(注:只能在容器创建时进行限制)

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

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

可以配合使用

CFS周期的有效范围:1ms-1s? ? ? ? --cpu-period? ? 1000-1000000毫秒

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

配额:

cat cpu.cfs_quota_us

-1

如果配置是-1,那么容器在使用宿主机cpu的时间不做任何限制。

cat cpu.cfs_period_us

100000

CFS调度周期的长度,单位微秒,在每个周期内,容器可以使用指定比例的cpu时间,默认情况下都是100ms(毫秒)。

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

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

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

就是100毫秒调度请求一次,每次只能使用这么多

docker stats test1/id:查看容器的运行占用宿主机资源的情况

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

设置容器占用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

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

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

#分别进入容器,进行压力测试
yum install -y epel-release
yum install -y stress

#stress 是一个用于模拟系统负载的工具,它可以测试系统在高负载条件下的稳定性。

stress -c 4?? ??? ??? ??? ?#产生四个进程,每个进程都反复不停的计算随机数的平方根

#查看容器运行状态(动态更新)
docker stats
CONTAINER ID ? NAME ? ? ? ? ? ? CPU % ? ? MEM USAGE / LIMIT ? ? MEM % ? ? NET I/O ? ? ? ? ?BLOCK I/O ? ? ? ? PIDS
c3ee18e65852 ? c2 ? ? ? ? ? ? ? 66.50% ? ?5.5MiB / 976.3MiB ? ? 0.56% ? ? 20.4MB / 265kB ? 115MB / 14.2MB ? ?4
bb02d3b345d8 ? c1 ? ? ? ? ? ? ? 32.68% ? ?2.625MiB / 976.3MiB ? 0.27% ? ? 20.4MB / 325kB ? 191MB / 12.7MB ? ?4

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

docker run -itd --name test5 --cpuset-cpus 1,3

容器占用cpu的时间

容器占用cpu的权重比(多个容器时,才有效,一个容器时,依然不受限)

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

2、内存:限制容器对内存的使用

创建3个容器,分别对这三个容器进行资源限制

centos1? 占用cpu的时间? 10000(10ms),占用cpu的权重? 256? ?占用内存是? 1G?只能使用cpu1

centos2? 占用cpu的时间? ?20000(20ms),占用cpu的权重 512? 占用内存? 2G?只能使用cpu2

centos3??占用cpu的时间? ?30000(30ms),占用cpu的权重 1024? 占用内存512m 只能使用cpu3

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

先限制内存,再限制swap 两个相减

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

如果不设置:-m 512m? 实际使用swap的空间是 -m 的两倍? 512M*2=1G

如果设置 -memory -swap的值,和内存限制一样,容器就不能使用swap(等于0)

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

磁盘I/O配额(了解):

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

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

dd if=/dev/zero of=123.txt bs=2M count=5 oflag=direct

oflg=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

删除已经停止的容器

删除所有未被使用的网桥设备(docker0、docker1)

删除所有未被使用的镜像

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

总结:

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

1、容器占用cpu的时间

2、容器占用cpu的权重

3、容器绑定cpu

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

-m?

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

-m 512m --memory-swap=1g

(1g-512=512)

-m 512m?--memory-swap=512m

相等就是0

-m 512m

不写就是两倍(512m*2=1024m)

-m 512m --memory-swap=-1

-1就是不限制

磁盘I/O:

清理docker占用的磁盘空间:

docker system prune -a

删除已经停止的容器

删除所有未被使用的网桥设备(docker0、docker1)

删除所有未被使用的镜像

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

文章来源:https://blog.csdn.net/m0_70766460/article/details/134870541
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。