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.rhkb.cn/news/451478.html

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

相关文章

ubuntu下安装mysql遇到的问题

ubuntu下安装mysql sudo apt install -y mysql-server 出现问题 ……by process 3455 解决 安装 启动 systemctl status mysql.service sudo mysql -u root -p 如何修改密码 与datagrip的连接 查看IP ifconfig 若没安装 参考 Windows10的DataGrip2024.1.4连接ubuntu22.04中的M…

Threejs 实现3D 地图(01)创建基本场景

"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" <script setup> import { onMounted,ref } from vue import * as THREE from three import * as d3 from "d3"; //莫开托坐标 矫正地图…

使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题

一、项目简介 使用过ABP框架的童鞋应该知道它也自带了一款免费的Blazor UI主题&#xff0c;它的页面是长这样的&#xff1a; 个人感觉不太美观&#xff0c;于是网上搜了很多Blazor开源组件库&#xff0c;发现有一款样式非常不错的组件库&#xff0c;名叫&#xff1a;Radzen&am…

【Linux系统编程】第三十四弹---使用匿名管道构建简易Linux进程池

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、引言 2、进程池的基本概念 3、管道在进程池中的应用 4、进程池的实现 4.1、master类定义 4.2、测试信道 4.3、通过cha…

一文读懂JPA及Mybatis的原理和机制(面试经)

导览 前言Q&#xff1a;什么是JPA1. 简介2. 原理 Q&#xff1a;JPA持久化框架—Mybatis1. 内部组成与关系2. 各组件作用域和生命周期3. 动态SQL3.1 if语句3.2 choose-when-otherwise 4. mapper映射XML4.1 select4.2 insert 5. $与#的区别5.1 #{...}5.2 ${...} 结语精彩回顾 前言…

明日周刊-第23期

十月已过半&#xff0c;气温也转凉了&#xff0c;大家注意保温哦。冬吃萝卜&#xff0c;夏吃姜&#xff0c;在快要到来的冬季大家可以选择多吃点萝卜。 配图是本周末去商场抓娃娃的时候拍的照片&#xff0c;现在抓娃娃单次普遍都控制在1块钱以下了&#xff0c;还记得多年前的抓…

qt继承结构

一、 继承结构 所有的窗口类均继承自QWidget类&#xff0c;因此QWidget类本身包含窗口的特性。QWidget对象本身既可以作为独立窗口&#xff0c;又可以作为组件&#xff08;子窗口&#xff09;。 通过构造函数可以创建以上两种形态的QWidget&#xff1a; // 参数1&#xff1a;使…

[C#][winform]基于yolov8的道路交通事故检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎&#xff0c;使用CPU进行推理&#xff0c;适合有显卡或者没有显卡windows x64系统均可&#xff0c;不支持macOS和Linux系统&#xff0c;不支持x86的windows操作系统。由于采用CPU推理&#xff0c;要比GPU慢。…

【重学 MySQL】七十一、揭秘数据库魔法——深入探索并引入视图

【重学 MySQL】七十一、揭秘数据库魔法——深入探索并引入视图 视图的定义视图的作用视图的注意事项 在MySQL数据库中&#xff0c;视图&#xff08;View&#xff09;是一种非常强大且灵活的工具&#xff0c;它为用户提供了以更安全、更清晰的方式查看和管理数据的途径。 视图的…

《计算机视觉》—— 换脸

效果如下&#xff1a; 完整代码&#xff1a; import cv2 import dlib import numpy as npJAW_POINTS list(range(0, 17)) RIGHT_BROW_POINTS list(range(17, 22)) LEFT_BROW_POINTS list(range(22, 27)) NOSE_POINTS list(range(27, 35)) RIGHT_EYE_POINTS list(range(36…

【深入解析】ChatGPT各版本在论文写作中的五大表现差异

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 人工智能在自然语言处理领域已取得了显著进展&#xff0c;尤其是OpenAI的ChatGPT系列在文本生成和理解方面表现突出。然而&#xff0c;不同版本的ChatGPT在论文写作中的表现存在明显差异…

Python 从入门到实战37(进程间通信)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;可以熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了通过multiprocessing模块创建进程操作的相关知…

力扣 142.环形链表Ⅱ【详细解释】

一、题目 二、思路 三、代码 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public ListNode detectCycle(ListNode hea…

javaWeb项目-ssm+jsp房屋出租管理系统功能介绍

本项目源码&#xff08;点击下方链接下载&#xff09;&#xff1a;java-ssmjsp房屋出租管理系统实现源码(项目源码-说明文档)资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff…

[含文档+PPT+源码等]精品基于springboot实现的原生Andriod大学校园食堂外卖系统App

基于Spring Boot实现的原生Android大学校园食堂外卖系统App的背景可以从以下几个方面进行阐述&#xff1a; 一、项目背景与需求 随着移动互联网技术的快速发展和智能手机的普及&#xff0c;大学生对于便捷、高效的校园生活服务需求日益增长。大学校园食堂作为学生们日常用餐的…

【电商项目】1分布式基础篇

1 项目简介 1.2 项目架构图 1.2.1 项目微服务架构图 1.2.2 微服务划分图 2 分布式基础概念 3 Linux系统环境搭建 查看网络IP和网关 linux网络环境配置 补充P123&#xff08;修改linux网络设置&开启root密码访问&#xff09; 设置主机名和hosts映射 主机名解析过程分析&…

【问题解决】——当出现0xc000007b和缺少mfc140.dll时,该怎么做才能让软件可以打开

目录 事情起因 问题处理 明确定义 填坑之路 最后我是怎么解决的&#xff08;不想看故事直接到这里&#xff09; 事情起因 最近想要重新安装西门子博途来做西门子的一些算法的时候&#xff0c;发现自己软件装的是V15.1的版本&#xff0c;而买的plc1200固件版本要求至少16以…

性能评测第一,阿里开源可商用AI模型Ovis 1.6使用指南,AI多模态大模型首选

什么是 Ovis 1.6 Gemma 2 9B&#xff1f; Ovis 1.6 Gemma 2 9B 是阿里国际AI团队推出的最新多模态大模型&#xff08;Multimodal Large Language Model&#xff0c;MLLM&#xff09;。该模型旨在结构化地对齐视觉和文本嵌入&#xff0c;能够处理和理解多种不同类型的数据输入&…

抑郁症自测量表 API 接口,洞察情绪状态

抑郁症是一种常见的心理疾病&#xff0c;会给患者的生活和工作带来很大的困扰。为了帮助人们更好地了解自己的情绪状态&#xff0c;有一种抑郁症自测量表&#xff08;简称SDS&#xff09;&#xff0c;它是一种能够反映病人主观抑郁症状的自评量表。下面我们将通过调用抑郁症自测…

基于FreeRTOS的LWIP移植

目录 前言一、移植准备工作二、以太网固件库与驱动2.1 固件库文件添加2.2 库文件修改2.3 添加网卡驱动 三、LWIP 数据包和网络接口管理3.1 添加LWIP源文件3.2 Lwip文件修改3.2.1 修改cc.h3.2.2 修改lwipopts.h3.2.3 修改icmp.c3.2.4 修改sys_arch.h和sys_arch.c3.2.5 修改ether…