docker 资源限制+调优详解

容器资源限制介绍

下面我将详细讲解 Docker 的各种资源限制及其在生产环境中的实际应用案例。我们将逐一探讨 CPU、内存、磁盘 I/O 和网络带宽的限制,并提供具体的配置示例和解释。

1. CPU 限制

1.1 设置 CPU 份额
  • --cpu-shares:设置容器的 CPU 优先级权重。默认值为 1024。较高的值表示更高的优先级。
    • 作用:当多个容器竞争 CPU 资源时,CPU 份额决定了每个容器可以获得的 CPU 时间比例。
    • 示例
      docker run -d --name container1 --cpu-shares 512 my_image
      docker run -d --name container2 --cpu-shares 1024 my_image
    • 解释:假设宿主机有 1 个 CPU 核心,container1 和 container2 同时需要 CPU 资源,那么 container2 将获得两倍于 container1 的 CPU 时间。
1.2 设置 CPU 配额
  • --cpus:限制容器可以使用的 CPU 核心数。例如,设置为 1.5 表示容器最多可以使用 1.5 个核心。

    • 作用:直接限制容器可以使用的 CPU 核心数,确保容器不会超过指定的核心数。
    • 示例
      docker run -d --name container1 --cpus 1.5 my_image
    • 解释container1 最多可以使用 1.5 个 CPU 核心,即使宿主机有更多的核心可用。
  • --cpu-period--cpu-quota:更细粒度地控制 CPU 时间片。

    • --cpu-period:设置 CPU CFS(Completely Fair Scheduler)调度器的时间周期(单位为微秒,默认为 100000 微秒)。
    • --cpu-quota:设置在每个周期内容器可以使用的 CPU 时间(单位为微秒)。
    • 作用:通过设置周期和配额,可以更精确地控制容器的 CPU 使用。
    • 示例
      docker run -d --name container1 --cpu-period 50000 --cpu-quota 25000 my_image
    • 解释container1 每 50000 微秒可以使用 25000 微秒的 CPU 时间,相当于 50% 的 CPU 使用率。

2. 内存限制

2.1 设置内存限制
  • --memory:限制容器可以使用的最大内存量(单位为字节或带单位的字符串,如 1g 表示 1GB)。

    • 作用:确保容器不会消耗超过指定的内存,防止 OOM(Out of Memory)错误。
    • 示例
      docker run -d --name container1 --memory 512m my_image
    • 解释container1 最多可以使用 512MB 的内存。
  • --memory-swap:设置容器可以使用的总内存(包括物理内存和交换空间)。如果设置为 -1,则不限制交换空间。

    • 作用:控制容器可以使用的总内存,包括物理内存和交换空间。
    • 示例
      docker run -d --name container1 --memory 512m --memory-swap 1g my_image
    • 解释container1 最多可以使用 512MB 的物理内存和 512MB 的交换空间,总共 1GB。
2.2 设置内存预留
  • --memory-reservation:设置容器的内存预留量。当系统内存紧张时,优先保证预留量。
    • 作用:在系统内存紧张时,优先保证某些容器的内存需求。
    • 示例
      docker run -d --name container1 --memory 512m --memory-reservation 256m my_image
    • 解释container1 最多可以使用 512MB 的内存,但在系统内存紧张时,至少保证 256MB 的内存。

3. 磁盘 I/O 限制

3.1 设置块设备 I/O 限制
  • --blkio-weight:设置容器的块设备 I/O 权重(范围为 10 到 1000,默认为 500)。

    • 作用:控制容器的 I/O 优先级。
    • 示例
      docker run -d --name container1 --blkio-weight 300 my_image
    • 解释container1 的 I/O 权重为 300,较低的权重意味着较低的 I/O 优先级。
  • --device-read-bps--device-write-bps:限制容器对特定设备的读写速度(单位为字节/秒)。

    • 作用:控制容器对特定设备的读写速度,防止 I/O 负载过高。
    • 示例
      docker run -d --name container1 --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb my_image
    • 解释container1 对 /dev/sda 设备的读写速度分别限制为 1MB/s。
  • --device-read-iops--device-write-iops:限制容器对特定设备的读写 IOPS(每秒 I/O 操作次数)。

    • 作用:控制容器对特定设备的 I/O 操作次数,防止 I/O 负载过高。
    • 示例
      docker run -d --name container1 --device-read-iops /dev/sda:1000 --device-write-iops /dev/sda:1000 my_image
    • 解释container1 对 /dev/sda 设备的读写 IOPS 分别限制为 1000 次/秒。

4. 网络带宽限制

4.1 使用 tc 工具

Docker 本身没有直接提供网络带宽限制的功能,但可以通过 tc(Traffic Control)工具来实现。

  1. 安装 tc 工具

    apt-get update && apt-get install -y iproute2
  2. 设置网络带宽限制

    tc qdisc add dev eth0 root handle 1: htb default 11
    tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit
    tc class add dev eth0 parent 1:1 classid 1:11 htb rate 1mbit
  3. 将容器的网络接口绑定到 tc 规则

    docker run -d --name my_container --net=none my_image
    container_id=$(docker inspect -f '{{.Id}}' my_container)
    veth_pair=$(ip link show | grep $container_id | awk '{print $2}' | cut -d '@' -f 1)
    ip link set $veth_pair netns $(docker inspect -f '{{.State.Pid}}' my_container)
    ip netns exec $(docker inspect -f '{{.State.Pid}}' my_container) ip link set lo up
    ip netns exec $(docker inspect -f '{{.State.Pid}}' my_container) ip link set $veth_pair up
    ip netns exec $(docker inspect -f '{{.State.Pid}}' my_container) tc qdisc add dev $veth_pair root handle 1: htb default 11
    ip netns exec $(docker inspect -f '{{.State.Pid}}' my_container) tc class add dev $veth_pair parent 1: classid 1:1 htb rate 1mbit
    ip netns exec $(docker inspect -f '{{.State.Pid}}' my_container) tc class add dev $veth_pair parent 1:1 classid 1:11 htb rate 1mbit

5. 其他资源限制

5.1 设置 PIDs 限制
  • --pids-limit:限制容器可以创建的最大进程数。
    • 作用:防止容器创建过多的进程,导致系统资源耗尽。
    • 示例
      docker run -d --name container1 --pids-limit 100 my_image
    • 解释container1 最多可以创建 100 个进程。
5.2 设置内核参数
  • --ulimit:设置容器的 ulimit 参数,如文件描述符数量。
    • 作用:控制容器的资源使用,防止资源耗尽。
    • 示例
      docker run -d --name container1 --ulimit nofile=1024:1024 my_image
    • 解释container1 的文件描述符数量限制为 1024。

生产实际案例

案例 1:Web 应用服务器

假设你有一个 Web 应用服务器,需要确保其不会消耗过多的 CPU 和内存资源,同时限制其磁盘 I/O 操作。

docker run -d --name web_app \--cpus 2 \--memory 1g \--memory-swap 2g \--device-read-bps /dev/sda:10mb \--device-write-bps /dev/sda:10mb \my_web_app_image
  • 解释
    • --cpus 2:限制 web_app 容器最多使用 2 个 CPU 核心。
    • --memory 1g:限制 web_app 容器最多使用 1GB 的内存。
    • --memory-swap 2g:限制 web_app 容器最多使用 2GB 的总内存(包括物理内存和交换空间)。
    • --device-read-bps /dev/sda:10mb 和 --device-write-bps /dev/sda:10mb:限制 web_app 容器对 /dev/sda 设备的读写速度分别为 10MB/s。
案例 2:数据库服务器

假设你有一个数据库服务器,需要确保其有足够的内存和 CPU 资源,同时限制其磁盘 I/O 操作。

docker run -d --name db_server \--cpus 4 \--memory 8g \--memory-swap -1 \--device-read-bps /dev/sda:50mb \--device-write-bps /dev/sda:50mb \my_db_image
  • 解释
    • --cpus 4:限制 db_server 容器最多使用 4 个 CPU 核心。
    • --memory 8g:限制 db_server 容器最多使用 8GB 的内存。
    • --memory-swap -1:不限制 db_server 容器的交换空间。
    • --device-read-bps /dev/sda:50mb 和 --device-write-bps /dev/sda:50mb:限制 db_server 容器对 /dev/sda 设备的读写速度分别为 50MB/s。
案例 3:批处理作业

假设你有一个批处理作业,需要在短时间内消耗大量 CPU 和内存资源,但不需要长期运行。

docker run -d --name batch_job \--cpus 8 \--memory 16g \--memory-swap -1 \--pids-limit 500 \my_batch_job_image
  • 解释
    • --cpus 8:限制 batch_job 容器最多使用 8 个 CPU 核心。
    • --memory 16g:限制 batch_job 容器最多使用 16GB 的内存。
    • --memory-swap -1:不限制 batch_job 容器的交换空间。
    • --pids-limit 500:限制 batch_job 容器最多创建 500 个进程。
案例 4:缓存服务

假设你有一个缓存服务,需要确保其不会消耗过多的内存资源,同时限制其网络带宽。

docker run -d --name cache_service \--memory 2g \--memory-swap 2g \--ulimit nofile=65536:65536 \my_cache_image
  • 解释
    • --memory 2g:限制 cache_service 容器最多使用 2GB 的内存。
    • --memory-swap 2g:限制 cache_service 容器最多使用 2GB 的总内存(包括物理内存和交换空间)。
    • --ulimit nofile=65536:65536:限制 cache_service 容器的文件描述符数量为 65536。

最后,完结撒花~后续会有更多内容 ,敬请期待 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56822.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx介绍+openresty配置

参考:资源下载 Nginx介绍openresty配置 nginx使用场景 1.什么是nginx性能高,官方测试5万并发连接;对cpu 内存资源消耗很低,而且运行非常稳定 免费 开源2.nginx应用场景1.http服务器静态资源 图片 js css 2.虚拟主机"虚拟"出多个主机, 域名80 www…

【AIGC】ChatGPT与人类理解力的共鸣:人机交互中的心智理论(ToM)探索

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯心智理论(Theory of Mind,ToM)心智理论在心理学与神经科学中的重要性心智理论对理解同理心、道德判断和社交技能的重要性结论 💯乌得勒支大学研究对ChatGPT-4…

设计一个多格式文件压缩与解压系统

设计一个多格式文件压缩与解压系统 在现代软件开发中,文件压缩和解压缩是一个常见且重要的需求。无论是为了节省存储空间,还是为了提高文件传输的效率,掌握文件压缩和解压缩的技术都是每个开发者必备的技能。本文将详细介绍如何设计一个支持多种压缩格式的文件压缩和解压系…

【C++篇】类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略

文章目录 前言 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗&#xff1…

redhat系列的yum源配置

一、Linux更改yum源为阿里云源 一)原yum源备份 cp -rp /etc/yum.repos.d/CentOS-Base.repo{,.bak} cp -rp /etc/yum.repos.d/epel.repo{,.bak} 二)更改为阿里云源  1、更改yum base源 下载新的CentOS-Base.repo 到/etc/yum.repos.d/ http://mirrors.al…

Android中的IntentService及其作用。

在Android开发中,处理后台任务是一个常见的需求。为了保证应用的流畅性和响应性,许多耗时操作需要在后台线程中执行。然而,直接管理后台线程可能会变得复杂且容易出错。为了简化这一过程,Android提供了IntentService,一…

软件设计模式------工厂方法模式

工厂方法模式(Factory Method Pattern),又称工厂模式,也叫虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Pactory Pattern),属于类创建型模式。 我们知道…

WIFI实现透传+接线图

单片机通过TX接WIFI模块的RX将设置的AT代码写入WIFI模块(连接WIFI调为设备模式(有设备,路由,双模等模式)) WIFI模块将响应信号通过TX通过CH340发给PC的RX 通过STC-ISP或安信可串口调试助手查看响应信息 …

Golang | Leetcode Golang题解之第495题提莫攻击

题目: 题解: func findPoisonedDuration(timeSeries []int, duration int) (ans int) {expired : 0for _, t : range timeSeries {if t > expired {ans duration} else {ans t duration - expired}expired t duration}return }

速盾:cdn走国内要备案吗?

在当今互联网时代,CDN(Content Delivery Network,内容分发网络)已经成为许多网站提高访问速度和稳定性的重要手段。然而,对于使用 CDN 走国内线路的网站来说,是否需要备案呢?这是许多网站管理员…

我开源了Go语言连接数据库和一键生成结构体的包【实用】

项目地址:https://gitee.com/zht639/my_gopkg autosql autosql 是一个简化数据库使用的模块,支持常见的数据库(MySQL、PostgreSQL、SQLite、SQL Server)。该模块不仅提供了数据库连接函数,还能自动生成数据表对应的结…

qt QGraphicsEffect详解

一、QGraphicsEffect概述 QGraphicsEffect通过挂接到渲染管道并在源(例如QGraphicsPixmapItem、QWidget)和目标设备(例如QGraphicsView的视口)之间进行操作来更改元素的外观。它允许开发者为图形项添加各种视觉效果,如…

基于netty实现简易版rpc服务-理论分析

1.技术要点 1.1 rpc协议 定义一个rpc协议类,用于rpc服务端和客户端数据交互。 1.2 netty粘包半包处理 由于数据传说使用tcp协议,rpc协议的数据在网络传输过程中会产生三种情况: 1)刚好是完整的一条rpc协议数据 2)不…

Java网络编程-简单的API调用

Get请求 - 无参数 安装依赖库 首先需要安装一个库&#xff1a; Okhttp3&#xff0c;这是一个非常流行的 HTTP 库&#xff0c;可以简单、快速的实现 HTTP 调用。 安装 Okhttp3 的方式是在 pom.xml 文件中增加依赖&#xff1a; <!-- https://mvnrepository.com/artifact/co…

【算法】哈希表:49.字母异位词分组

目录 1、题目链接 2、题目介绍 3、解法 初始化设定--图解 步骤图解 4、代码 1、题目链接 49. 字母异位词分组 - 力扣&#xff08;LeetCode&#xff09; 2、题目介绍 3、解法 字母异位词的本质是字符相同但排列不同。因此&#xff0c;我们可以对字符串进行排序&#xf…

YOLOv8实战水果识别【数据集+YOLOv8模型+源码+PyQt5界面】

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对水果数据集进行训练和优化&#xff0c;该数据集包含丰富的水果图像样本&#xf…

linux 系统怎么使用

Linux系统的使用涉及多个方面&#xff0c;包括文件管理、目录操作、用户管理、进程管理、网络配置等。以下是对Linux系统基础使用的详细介绍&#xff1a; 一、文件管理 查看文件和目录 ls&#xff1a;列出当前目录的内容。ls -l&#xff1a;以长格式列出当前目录的内容&#x…

CGAL概述

目录 一、概述 主要特点 二、2D、3D几何问题 1、二维几何问题 2、三维几何问题 2、2D、3D 三角剖分 1、二维三角剖分 2、三维三角剖分 3、2D、3D网格处理 1、网格处理 2、基本操作 1. 添加/删除顶点 2. 移动顶点 3. 网格细分与简化 4. 网格平滑 5. 网格修复 6.…

零基础Java第七期:方法的使用

一、方法的概念与使用 1.1. 方法的概念 方法就是一个代码片段. 类似于 C 语言中的 "函数"。方法存在的意义&#xff1a; 是能够模块化的组织代码(当代码规模比较复杂的时候)做到代码被重复使用, 一份代码可以在多个位置使用让代码更好理解更简单直接调用现有方法开…

Solidity基础语法

Solidity的在线编辑器&#xff1a;https://remix.ethereum.org/ 一、合约结构 1、SPDX许可标识&#xff1a;指定代码的开源许可 2、pragma指令&#xff1a;声明Solidity版本 3、导入语句&#xff1a;引入其他合约或库 4、合约声明&#xff1a;使用contract关键字 5、状态变量&…