当前位置: 首页 > news >正文

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

二、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

注: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

上述命令将会从/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

通过上面可以看到读取收到了限制。

http://www.dtcms.com/a/494809.html

相关文章:

  • Compose Multiplatform+Kotlin Multiplatfrom 第七弹跨平台 AI开源
  • C++设计模式_行为型模式_状态模式State
  • 网站怎么绑定域名wordpress zhong
  • wpf中Grid的MouseDown 事件无法触发的原因
  • WPF中的坐标转换
  • 重庆学校网站建设html入门网页制作
  • 词向量:开启自然语言处理的奇妙之旅
  • MySQL 5.7 和 8.0 基于kubernetes的yaml部署方案-单实例和高可用
  • 如何给Windows云主机进行加固
  • binLog、redoLog和undoLog的区别
  • 如何做医美机构网站观察分析电商素材网站
  • k8s localpath csi原理
  • 如何解决在xml中传入Integer整型参数为0时条件失效问题?
  • wordpress建什么站希音跨境电商
  • python爬虫学习
  • MySQL 8.0.29 及以上版本中 SSL/TLS 会话复用(Session Reuse)
  • 【项目-】Qt + QCustomPlot 实现频谱监测仪:四图联动、高频信号注入、鼠标交互全解析
  • 用于博客美化的测试(后面再更新)
  • 【一文了解】正则表达式
  • MySQL中表操作
  • 中国建设银行大学助学贷款网站网站备案对网站负责人的要求
  • 江门云建站模板东城企业网站开发
  • 使用Selenium Server 4连接已经运行的Firefox
  • 普蓝机器人PlanRobot-DR200:基于多传感融合的全天候电力巡检自主导航技术与实践
  • PHPCMS V9 自定义证书查询模块(Ajax+防刷+倒计时)
  • 一体化运维平台:当下运维体系的核心支柱
  • HarmonyOS后台任务管理:短时任务与长驻任务实战
  • Unity游戏基础-6(跨平台生成游戏作品,针对安卓教程)
  • Luminex xMAP技术原理与应用概述
  • Http基础协议和解析