docker的资源控制

2023-12-13 03:39:46

docker容器的资源控制

?Docker通过Cgroup 来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。Cgroup 是ControlGroups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、内存、磁盘,io等等)的机制,被LXC、docker等很多项目用于实现进程资源控制。Cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理是通过该功能来实现的。
?

cpu资源控制

cpu的使用上限

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

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

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

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

可以配合使用

CFS周期的有效范围:1ms-1s --cpu-period 1000-100 0000

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

[root@docker1 2ba14014323a7d68536ebd8414bcb6a52e1b8f196652509145b49c4a1a529e04]# cat cpu.cfs_quota_us
-1

-1:如果配置是-1,那么容器在使用宿主机没有限制,随便用



[root@docker1 2ba14014323a7d68536ebd8414bcb6a52e1b8f196652509145b49c4a1a529e04]# cat cpu.cfs_period_us
100000

cpu.cfs_period_us

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

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


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

cpu.cfs_quota_us

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

正常打开cpu,测试使用上限

cd /opt
docker exec -it test1 bash
yum -y install vim

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

wq
chmod 777 cpu.sh
./cpu.sh

top查看
会发现脚本把cpu占满了


还能用docker top查看

docker top test1

docker status test1/id 可以容器的运行占用宿主机资源的情况
docker top test1/id  查看容器内宿主机和容器PID的关系

如何用配置文件方式让容器使用cpu只能用一半

docker ps -a
cd /sys/fs/cgroup cpu
ls
cd docker 
cd shfbsdjfhughvbdfffjregjerbjgf
echo 50000 > cpu.cfs_period_us

如何对容器占用cpu的时间进行限制

设置cpu的资源占用权重比:需要多个容器才能生效。

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

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

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

docker exec -it test3 bash

yum -y install epel-release

yum -y install stress
//模拟系统负载的工具

stress -c 4
top
显示查看cpu还是被占满了



docker exec -it test4 bash
yum -y install epel-release

yum -y install stress

stress -c 4

docker stats

--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-release
yum insyall stress -y
//压力测试工具
stress -c 4
top
查看
1,3被使用

内存的使用限制

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

如何限制使用swap

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

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

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

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

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

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

磁盘i/o配置

磁盘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:1M centos:7 /bin/bash
docker exec -it test9 bash
cd /opt
ls
dd if=/dev/zero of=123.txt bs=1M count=10

dd if=/dev/zero of=123.txt bs=1M count=10 oflag=direct
在使用命令获取空字符集,是从文件系统的缓存当中输入,速度是比较快的。禁用文件系统缓存,直接把数据写入磁盘,可以更真实的测试设备的性能,模拟直接写入的物理设备的情况

限制容器读取的次数,限制容器写入设备的次数(了解即可)

对读取进行设置,每秒100次
docker run -itd --name test10 --device-read-iops /dev/sda:100 centos:7 /bin/bash


对写取进行设置,每秒50次
docker run -itd --name test10 --device-write-iops /dev/sda:50 centos:7 /bin/bash

清理docker占用的磁盘空间

[root@docker1 opt]# docker system prune -a
WARNING! This will remove:
  - all stopped containers
//删除已经停止的容器

  - all networks not used by at least one container
//删除所有未被使用的网桥设备

  - all images without at least one container associated to them
//删除所有未被使用的镜像

  - all build cache
//删除创建容器时的缓存,以及无用的数据卷

总结

怎么对容器使用cpu进行限制? ??--cpu-quota 10000? (单位毫秒)

容器占用cpu的权重? ? ? ? ? ? ? ? ??--cpu-shares (1024倍数)

容器绑定cpu? ? ? ? ? ? ? ? ? ? ? ? ? ??--cpuset-cpus

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

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

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

磁盘i/o: 清理docker占用的磁盘空间

扩展练习

centos1 占用cpu的时间,10000。占用cpu的权重256。占用内存1GB。cpu1

centos2 占用cpu的时间,20000. 占用权重 512。占用内存2G。cpu2

centos3 占用cpu的时间,30000. 占用权重 1024。占用内存512m。cpu3

并且都用一条命令解决

docker run -itd --name centos1 --cpu-quota 10000 --cpu-shares 256 --cpuset-cpus 1 -m 1g centos:7 /bin/bash

docker run -itd --name centos2 --cpu-quota 20000 --cpu-shares 512 --cpuset-cpus 2 -m 2g centos:7 /bin/bash

docker run -itd --name centos3 --cpu-quota 30000 --cpu-shares 1024 --cpuset-cpus 3 -m 512m centos:7 /bin/bash

--name centos1    指定容器名
--cpu-quota 30000 内核分配给容器使用cpu的时间
--cpu-shares      容器占cpu的权重
--cpuset-cpus     指定容器使用哪个cpu
-m             指定容器占用内存

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