docker 运行容器限制内存、限制磁盘 IO

一、内存限制

例 1:允许容器使用的内存上限为 256M:

root@xuegod63 \~\]# docker run --name m1 -itd -m 256m rockylinux:8.8 \[root@xuegod63 \~\]# docker exec -it m1 /bin/bash 查看: \[root@6112f00d3a99 /\]#cat /sys/fs/cgroup/memory/memory.limit_in_bytes 268435456 1 兆(MB)= 1,048,576 字节,268435456/1,048,576=256M 模拟压测: \[root@xuegod63\]# docker cp /usr/bin/stress m1:/usr/bin/ 可以使用以下命令模拟占用 1024MB 的内存: \[root@6112f00d3a99 /\]# stress --vm-bytes 1024M --vm-keep -m 100 在 xuegod63 上,用 docekr stats 查看,内存始终在 256M,没达到 1024M ![](https://i-blog.csdnimg.cn/direct/c2de5c8efe044856a0932f202ab72778.png) ### 二、docker 运行容器限制磁盘 IO 1、什么是磁盘 IO? 磁盘 I/O(Input/Output)指的是计算机系统中磁盘和其他设备之间数据的读取和写入操作。磁盘 是存储数据的重要设备,I/O 操作是将数据从磁盘读取到内存或者将内存中的数据写入磁盘的过程。 例如,在打开一个文件的过程中,操作系统需要从磁盘中读取文件的内容,将其存储到内存中供程序使用,这就是磁盘 I/O 的一种常见操作。又如,当我们保存一个文件时,程序会将文件内容从内存中写入到磁盘中,也是磁盘 I/O 的操作之一。 I/O 速度的快慢对系统性能有很大的影响,因此对于一些需要高性能的应用,比如数据库、Web 服 务器等,通常需要对磁盘 I/O 进行优化和限制,以保证系统的稳定和高效。 2、磁盘和内存的对比分析 磁盘和内存都是计算机存储数据的设备,但是它们的作用和特点不同。 内存是计算机中的临时存储器件,用于存储正在运行的程序、操作系统和其他应用程序所需的数据。它的特点是速度快,但存储容量比较小,且不具备数据持久化能力,即当电源关闭时内存中的数据就会丢失。 磁盘是计算机中的永久存储器件,用于存储长期保存的数据,如操作系统、应用程序、文档、图片、音视频文件等。它的特点是存储容量比较大,但速度较慢,且可以实现数据持久化,即即使电源关闭,磁盘中的数据也能够保存下来。 在计算机运行过程中,内存和磁盘都是不可或缺的,它们之间的关系是内存中的数据需要从磁盘中加载到内存中进行运行处理,运行结果需要从内存中写回磁盘进行长期保存。磁盘 IO 则是指磁盘上的读写操作,包括从磁盘中读取数据到内存中,或将内存中的数据写回到磁盘中进行保存。 3.为什么要对磁盘 IO 做限制? 对磁盘 IO 做限制是为了防止过多的 I/O 请求导致磁盘性能下降,甚至是宕机。当多个进程或容器 同时访问磁盘时,如果没有限制磁盘 IO,可能会导致 I/O 瓶颈,使得磁盘无法承受过多的请求,从而降低系统的整体性能。 通过限制容器的磁盘 IO,可以保证每个容器在一定程度上独享磁盘 IO 资源,避免容器之间的竞争 和影响。同时,限制磁盘 IO 也可以避免恶意容器滥用系统资源,对系统的稳定性和安全性造成影响。 举个例子,如果一个应用程序或容器在短时间内对磁盘资源进行了大量的读写操作,那么可能会导致其他应用程序或容器无法及时访问磁盘资源,进而影响系统整体的性能和稳定性。 \[root@xuegod63 \~\]# docker run --help --device-write-bps value #限制容器向指定设备写入的字节数/秒。 --device-read-bps value #限制容器从指定设备读取的字节数/秒。 这两个选项都需要指定限制的字节数/秒。可以使用以下格式指定: • 以字节为单位的值,例如 --device-read-bps=/dev/sda:1024 表示限制从 /dev/sda 设备读取的速率为每秒 1024 字节。 • 可选的单位有 B(字节)、K(千字节)、M(兆字节)和 G(吉字节),例如 --deviceread-bps=/dev/sda:1M 表示限制从 /dev/sda 设备读取的速率为每秒 1 兆字节。 如果从百度网盘下载资料,会受到百度网盘磁盘 I/O 的限制。百度网盘的磁盘 I/O 限制是指在一定 时间内,每个用户的读写操作次数和速度都受到限制,以确保网盘的稳定性和安全性。一般情况下,百度网盘会根据用户的使用情况,动态地调整磁盘 I/O 限制,以平衡不同用户之间的资源分配和使用需求。 #### **1:限制容器实例对硬盘的最高写入速度设定为 1MB/s。** 假设我们要创建一个名为 my-app 的 Docker 容器,并将其对硬盘的最高写入速度限制为 1MB/s。 可以通过在容器运行时使用--device 参数挂载磁盘设备,并通过--device-write-bps 参数限制写入速度实现。具体操作步骤如下: 创建一个名为 my-data 的目录,用于挂载到容器中作为数据卷: > \[root@xuegod63 \~\]# mkdir my-data > > 启动一个新的 Docker 容器,将 my-data 目录挂载到容器的/data 目录,并将写入速度限制为 > > 1MB/s: > > \[root@xuegod63 \~\]#docker run --rm -it --device **/dev/sda:/dev/sda** --device-write-bps > > /dev/sda:**1mb** -v "$(pwd)/my-data:/data" --name my-app rockylinux:8.8 > > 在上述命令中,--device /dev/sda:/dev/sda 参数表示将主机上的/dev/sda 设备挂载到容器的 > > /dev/sda 目录下;--device-write-bps /dev/sda:1mb 参数表示将对/dev/sda 设备的写入速度限制为 1MB/s;-v "$(pwd)/my-data:/data"参数表示将主机上的 my-data 目录挂载到容器的/data 目录下。进入容器中,创建一个名为 test.txt 的文件,并向其中写入一些数据 > \[root@511d79a63efa /\]#cd /data \[root@511d79a63efa /\]#time dd if=/dev/sda of=/data/test.out **bs=1M count=50** oflag=direct,nonblock![](https://i-blog.csdnimg.cn/direct/d4ad1236bae448e6a96daddb7a71d935.png) 注:dd 参数: 1、if=/dev/sda:指定输入文件,本例中为/dev/sda 设备; 2、of=/data/test.out:指定输出文件,本例中为/data/test.out 文件; 3、bs=1M:指定每次读取/写入的块大小为 1MB; 4、count=50:指定要读取/写入的块数,本例中为 50 块,即总共读取/写入 50MB 的数据; 5、oflag=direct,nonblock:指定将数据直接写入目标文件,跳过文件系统缓存,同时使用非阻塞 I/O 操作。 其中,oflag=direct 和 oflag=nonblock 是两个独立的参数。oflag=direct 参数表示使用直接 I/O(Direct I/O),即直接读取/写入物理设备而不是使用文件系统缓存;oflag=nonblock 参数表示使用非阻塞 I/O(Non-blocking I/O),即使用非阻塞 I/O 操作,避免在 I/O 操作中阻塞进程。 其中,oflag=direct 和 oflag=nonblock 是两个独立的参数。oflag=direct 参数表示使用直接 I/O(Direct I/O),即直接读取/写入物理设备而不是使用文件系统缓存;oflag=nonblock 参数表示使用非阻塞 I/O(Non-blocking I/O),即使用非阻塞 I/O 操作,避免在 I/O 操作中阻塞进程。 #### **2:限制容器实例对硬盘的最高读取速度设定为 1MB/s。** 首先,在宿主机上创建一个文件用于挂载到 Docker 容器中进行测试。例如,可以在宿主机上创建一个大小为 1GB 的文件: \[root@xuegod63 \~\]# mkdir /data/ \[root@xuegod63 \~\]#dd if=/dev/zero of=/data/testfile bs=1M count=1000 上述命令将会创建一个名为 testfile 的文件,大小为 1GB。 接下来,使用 docker run 命令启动一个 Docker 容器,并将创建的文件挂载到容器中: \[root@xuegod63 \~\]#docker run -it --name test --mount type=bind,source=/data/testfile,target=/testfile rockylinux:8.8 上述命令将会启动一个名为 test 的 Docker 容器,并将宿主机上的/data/testfile 文件挂载到容器 内的/testfile 目录中。 > docker run 命令是 Docker 中用于启动容器的命令,其常用参数包括: > > -i:以交互模式运行容器。 > > -t:为容器分配一个伪终端。 > > --name:指定容器的名称。 > > --mount:将主机文件系统中的文件或目录挂载到容器中。 > > type=bind:指定挂载类型为绑定挂载。 > > source=/data/testfile:指定宿主机上要挂载的文件或目录。 > > target=/testfile:指定容器中挂载的路径。 现在可以在 Docker 容器内部使用 dd 命令测试磁盘 IO 读取速度。首先,可以使用以下命令测试没 有限制的读取速度: \[root@28c11da0e12e /\]#dd if=/testfile of=/dev/null bs=1M count=1000 iflag=direct ![](https://i-blog.csdnimg.cn/direct/6c887f95560246c2a7a8aa05ea0616a4.png) 上述命令将会从/testfile 文件中读取 1GB 的数据,并将数据丢弃。iflag=direct 参数用于跳过文件 系统缓存。 然后,可以使用--device-read-bps 参数限制容器磁盘 IO 读取速度。例如,以下命令将会限制容器 的磁盘 IO 读取速度为 1MB/s: \[root@xuegod63 \~\]#docker run -it --name test1 --mount type=bind,source=/data/testfile,target=/testfile --device-read-bps /dev/sda:1mb rockylinux:8.8 最后,再次使用 dd 命令测试磁盘 IO 读取速度。例如,以下命令将会测试容器中挂载的/testfile 文 件的读取速度: \[root@b4acc4c30a27 /\]# dd if=/testfile of=/dev/null bs=1M count=1000 iflag=direct ![](https://i-blog.csdnimg.cn/direct/68c22510262d4c0196be2a83711f6c90.png) 通过上面可以看到读取收到了限制。

相关推荐
努力进修3 分钟前
跨地域传文件太麻烦?Nginx+cpolar 让本地服务直接公网访问
运维·nginx·cpolar
Qayrup13 分钟前
docker 搭建私有仓库,推送并拉取
运维·docker·容器
闪耀星星17 分钟前
debian elctron-builder
运维·debian
会飞的土拨鼠呀18 分钟前
Debian 12 笔记本合盖不休眠设置指南
运维·debian
郭庆汝30 分钟前
docker拉取英伟达官方cuda11.8镜像
docker·cuda11.8
天下不喵2 小时前
Ubuntu24.04安装Docker过程记录
docker
黑黍2 小时前
如何在k8s中配置并使用nvidia显卡
云原生·容器·kubernetes
梁正雄3 小时前
6、prometheus资源规划
运维·服务器·服务发现·prometheus·监控
晨曦之旅3 小时前
零成本体验云计算!阿贝云免费服务器深度测评
运维·服务器·云计算
工具人55553 小时前
Linux 抓取 RAM Dump 完整指南
linux·运维·安全