docker的资源控制

docker的资源控制

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

docker使用linux自带的功能cgroup

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

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

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

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

container:容器和容器之间共用一个网络命名空间。其他的资源依然是隔离的

  1. CPU资源控制

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

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

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

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

可以配置使用

CFS周期的有效范围:1m-1s,--cpu-period 1000-1000000

cat cpu.cfs_quota_us

-1

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

cat cpu.cfs_period_us

100000

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

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

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

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

docker stats test1/id 可以容器的运行占用宿主机资源的情况

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

容器占用cpu的时间

修改配置文件进行cpu限制

docker exec -it test1 bash

yum -y install vim

vim cpu.sh

#!/bin/bash

i=0

while true

do

let i++

done

chmod 777 cpu.sh

./cpu.sh

docker stats test1/id

#可以查看容器的运行占用宿主机资源的情况

docker top test1

#查看容器内的进程pid和容器外的进程pid映射关系

修改配置文件进行cpu限制:

docker ps -a

cd /sys/fs/cgroup/cpu/docker/d62c444a5e4118a078e84be01de30f18372b28dfe7358caee183f4da986fa40a

echo 50000 > cpu.cfs_quota_us

在容器中查看是否生效

cd /opt/

Top

创建容器时进行cpu限制

docker run -itd --name test2 --cpu-quota 40000 centos:7 /bin/bash

docker exec -it test2 bash

vim cpu.sh

#!/bin/bash

i=0

while true

do

let i++

done

chmod 777 cpu.sh

./cpu.sh

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

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

--cpu-shares 是给每个容器使用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

docker exec -it test4 bash

yum -y install epel-release

yum -y install stress

stress -c 4

在宿主机查看

docker stats

#不加容器名就是显示所有容器占用情况

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

docker run -itd --name test5 --cpuset-cpus 1 centos:7 /bin/bash

docker exec -it test5 bash

yum -y install epel-release

yum -y install stress

stress -c 4

在宿主机查看

top

容器占用cpu的时间

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

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

内存:限制容器堆内存的使用

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

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

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

docker stats

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

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

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

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

docker stats

磁盘I/O配置:

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

doker run -itd --name test8 --device-read-bps /dev/sda:1M centos:7 /bin/bash

限制容器在磁盘上的写限制

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

docker exec -it test9 bash

dd if=/cev/zero of=123.txt bs=1 count=10 oflag=direct

oflag=direct

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

限制容器读取的次数

docker run -itd --name test10 --device-read-iops /dev/sda:100 centos:7/bin/bash

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

限制容器写入的次数

docker run -itd --name test10 --device-write-iops /dev/sda:50 centos:7/bin/bash

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

清理docker占用的磁盘空间

docker system prune -a

删除已经停止的容器

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

删除所有未被使用的镜像

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

相关推荐
Java陈序员3 小时前
轻量强大!一款现代化的 Kubernetes 集群管理与监控工具!
云原生·容器·kubernetes
爱吃橘子橙子柚子1 天前
3CPU性能排查总结(超详细)【Linux性能优化】
运维·cpu
Sheffield2 天前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield2 天前
Alpine是什么,为什么是Docker首选?
linux·docker·容器
马艳泽2 天前
win10下运行Start Broker and Proxy报错解决
docker
舒一笑3 天前
程序员效率神器:一文掌握 tmux(服务器开发必备工具)
运维·后端·程序员
NineData3 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
用户13573999256603 天前
Windows 从 0 搭建 WSL2 原生 AI 开发环境:Codex + Docker + VSCode
docker
vi_h3 天前
在 macOS 上通过 Docker 安装并运行 Ollama(详细可执行教程)
macos·docker·ollama
黑心老魔3 天前
通过 Docker 创建开发环境
docker·开发环境