Docker的资源控制管理

简介: 1、CPU控制2、对内存使用进行限制3、对磁盘I/O配额控制的限制

1、CPU控制:


  cgroups,是一个非常强大的linux内核工具,他不仅可以限制被namespace隔离起来的资源,


还可以为资源设置权重、计算使用量、操控进程启停等等。所以cgroups (Control groups) 实现了对资源的配额和度量。


cgroups有四大功能:


  1. 资源限制:可以对任务使用的资源总额进行限制;
  2. 先级分配:通过分配的cpu时间片数量以及磁盘I0带宽大小,实际上相当于控制了任务运行优先级;
  3. 资源统计:可以统计系统的资源使用量,如cpu时长, 内存用量等;
  4. 任务控制: cgroup可以对任务执行挂起、恢复等操作。

 

设置CPU使用率上限:


  • Linux通过CFS ( Completely Fair Scheduler, 完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms
  • 可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少CPU时间。
  • 使用--cpu-period即可设置调度周期,使用--cpu-quota即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。
  • CFS周期的有效范围是1ms~1s, 对应的--cpu-period的数值范围是1000~1000000。
  • 容器的CPU 配额必须不小于1ms,即--cpu-quota 的值必须>= 1000。

 

查看CPU使用率:


docker run -itd --name test5 centos:7 /bin/bash
docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES
85c7a6860f72   centos:7   "/bin/bash"   4 seconds ago   Up 4 seconds             test5
cd /sys/fs/cgroup/cpu/docker/85c7a6860f72d66e36c924977891c170c111fb86a6f9b263c2bce36b0415e61c/
cat cpu.cfs_period_us cpu.cfs_quota_us
100000
-1


2387773-20211011141721674-2012545433.png


测试CPU使用率:


docker exec -it 23f23129d461 bash
vi cpu.sh
#!/bin/bash
i=0
while true
do
    let i++
done
chmod +x cpu.sh
./cpu.sh &
另一个终端使用top查看


2387773-20211011141730007-2031241849.png

2387773-20211011141733897-1283518866.png


设置CPU使用率:


#设置508的比例分配CPU使用时间上限
docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash       #可以重新创建一个容器并设置限额
或者
cd /sys/fs/cgroup/cpu/docker/45a914abdf2b9d173be7dd383c685b44d118bbb5d6bd3ef81b3a8c728a352f53/
echo 50000 > cpu.cfs_quota_us                                            #修改参数
cat cpu.cfs_quota_us cpu.cfs_period_us
50000
100000
docker exec -it 45a914abdf2b bash
./cpu.sh
另一个终端使用top查看


2387773-20211011141740759-2007807884.png2387773-20211011141744529-1599069920.png


设置CPU资源占用比(设置多个容器时才有效):


Docker通过--cpu-shares指定CPU份额,默认值为1024,值为1024的倍数。

示例:创建两个容器为test1 和test2, 若只有这两个容器,设置容器的权重,使得test1和test2的CPU资源占比为1/3和2/3。


docker run -itd --name test1 --cpu-shares 1024 centos:7
docker run -itd --name test2 --cpu-shares 512 centos:7
#分别进入容器,进行压力测试
docker exec -it 2e71bd7f3c4c bash
yum install -y epel-release
yum install stress -y
stress -c 4                 #产生四个进程,每个进程都反复不停的计算随机数的平方根
#查看容器的运行状态(动态更新)
docker stats
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O        PIDS
2e71bd7f3c4c   test2     32.96%     1.562MiB / 976.3MiB   0.16%     25.5MB / 137kB   179MB / 25.2MB   1
ffbdd0ef2781   test1     65.86%     12.2MiB / 976.3MiB    1.25%     25.5MB / 102kB   122MB / 25.2MB   1


2387773-20211011144859227-136347350.png2387773-20211011144903569-990224138.png2387773-20211011144907151-1637223245.png2387773-20211011145055484-1853070520.png


2、对内存使用进行限制:


docker run -itd --name test4 -m 512m centos:7 bash
docker stats


2387773-20211011145055484-1853070520.png


3、对磁盘I/O配额控制的限制:


–device - read-bps:限制某个设备上的读速度bps (数据量),单位可以是kb、mb (M)或者gb。


docker run -itd --name test5 --device-read-bps /dev/sda:1M centos:7 bash


–device-write-bps :限制某个设备上的写速度bps (数据量),单位可以是kb、mb (M)或者gb。


docker run -itd --name test5 --device-write-bps /dev/sda:1M centos:7 bash
--device-read-iops :限制读某个设备的iops (次数)
--device-write-iops :限制写入某个设备的iops (次数)
[root@docker ~]# docker run -itd --name test5 --device-write-bps /dev/sda:1M centos:7 bash
9039c0c86ae377ccd92373dba7bf6663e77af571fed25a799c0dc415043daf98
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS                        PORTS     NAMES
9039c0c86ae3   centos:7   "bash"        8 seconds ago    Up 7 seconds                            test5
[root@docker ~]# docker exec -it 9039c0c86ae3 bash
[root@9039c0c86ae3 /]# mkdir /test 
[root@9039c0c86ae3 /]# cd test/
#通过dd来验证写速度
[root@9039c0c86ae3 test]# dd if=/dev/zero of=test.txt bs=2M count=5 oflag=direct    #添加oflag参数以规避掉文件系统cache
5+0 records in
5+0 records out
10485760 bytes (10 MB) copied, 10.0057 s, 1.0 MB/s


2387773-20211011150615326-1710541562.png

相关文章
|
19天前
|
Prometheus 监控 Cloud Native
如何使用Prometheus监控Docker Swarm集群的资源使用情况?
还可以根据实际需求进行进一步的配置和优化,如设置告警规则,当资源使用超出阈值时及时发出警报。通过这些步骤,能够有效地使用 Prometheus 对 Docker Swarm 集群的资源进行监控和管理。
37 8
|
7月前
|
存储 安全 持续交付
【Docker 专栏】Docker 镜像的版本控制与管理
【5月更文挑战第9天】本文探讨了Docker镜像版本控制与管理的重要性,包括可重复性、回滚能力、协作开发和持续集成。常用方法有标签、构建参数和版本控制系统。管理策略涉及定期清理、分层管理和镜像仓库。语义化标签、环境变量和配置文件在版本控制中有应用。版本系统与Docker结合能跟踪历史和促进协作。注意点包括优化镜像大小、确保安全性和兼容性。案例分析和未来趋势展示了持续发展的镜像管理技术,为Docker应用的稳定与进步保驾护航。
369 7
【Docker 专栏】Docker 镜像的版本控制与管理
|
2月前
|
存储 Linux 数据中心
docker的底层原理四: 资源隔离
本文详细解释了Docker利用Linux内核的Namespace和Cgroups技术实现资源隔离,包括CPU、内存、网络、存储、文件系统、进程间通信、用户和用户组以及进程ID和主机名的隔离,确保容器的独立性和系统的安全性。
72 0
|
3月前
|
存储 数据中心 Docker
Docker如何实现资源隔离?
Docker如何实现资源隔离?
61 1
|
4月前
|
缓存 Kubernetes 数据中心
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
|
5月前
|
监控 数据可视化 Linux
使用Portainer图形化工具轻松管理远程Docker环境并实现远程访问
使用Portainer图形化工具轻松管理远程Docker环境并实现远程访问
|
5月前
|
存储 缓存 安全
Docker 如何管理镜像?
【7月更文挑战第11天】
112 0
Docker 如何管理镜像?
|
5月前
|
安全 关系型数据库 开发者
Docker Compose凭借其简单易用的特性,已经成为开发者在构建和管理多容器应用时不可或缺的工具。
Docker Compose是容器编排利器,简化多容器应用管理。通过YAML文件定义服务、网络和卷,一键启动应用环境。核心概念包括服务(组件集合)、网络(灵活通信)、卷(数据持久化)。实战中,编写docker-compose.yml,如设置Nginx和Postgres服务,用`docker-compose up -d`启动。高级特性涉及依赖、环境变量、健康检查和数据持久化。最佳实践涵盖环境隔离、CI/CD、资源管理和安全措施。案例分析展示如何构建微服务应用栈,实现一键部署。Docker Compose助力开发者高效驾驭复杂容器场景。
78 1
|
7月前
|
存储 数据管理 数据安全/隐私保护
【Docker专栏】Docker存储卷管理:数据持久化的关键
【5月更文挑战第7天】本文探讨了Docker容器中数据持久化的关键——存储卷,包括其独立于容器生命周期的特性、数据共享与迁移能力。Docker提供默认、命名、数据卷容器和挂载宿主机目录四种卷类型。创建与管理涉及`docker volume create`、`ls`、`run`等命令。最佳实践建议使用命名存储卷,定期备份,避免存储敏感数据,并清理未使用卷。了解和有效管理存储卷能提升容器灵活性和数据管理效率。
168 5
【Docker专栏】Docker存储卷管理:数据持久化的关键
|
7月前
|
存储 安全 数据中心
【Docker 专栏】Docker 容器与宿主机的资源隔离机制
【5月更文挑战第8天】Docker容器利用Namespace和Cgroups实现资源隔离,保证CPU、内存、网络和存储的独立,提升资源利用率和系统安全性。资源隔离有助于简化应用部署与管理,但也带来资源竞争、监控管理及安全挑战。理解并善用资源隔离机制能实现更高效、安全的容器运行。随着技术进步,Docker容器资源隔离将持续优化。
586 2
【Docker 专栏】Docker 容器与宿主机的资源隔离机制