DockerStart容器时解决硬件资源争抢的策略

老宇吖_3483

老宇吖_3483

2026-03-25

906人浏览

原创

Docker容器需设资源限制防争抢:CPU用--cpus或--cpu-shares,内存必配--memory防OOM,磁盘I/O和网络需按设备或tc限速,宿主机启用cgroup v2并调优内核参数。

dockerstart容器时解决硬件资源争抢的策略

启动 Docker 容器时若不加限制,多个容器可能同时抢占 CPU、内存、磁盘 I/O 或网络带宽,导致关键服务响应变慢甚至崩溃。核心思路是:在 docker run 或编排配置中主动设置资源约束,并配合宿主机调度策略,让容器“有节制地用资源”,而非“抢到算赢”。

CPU 资源隔离:避免“全核满载”式争抢

Docker 默认不限制 CPU 使用,容器可占满所有可用核心。建议根据服务类型设置 --cpus(推荐)或 --cpu-shares(相对权重):

  • --cpus=1.5:限制容器最多使用 1.5 个逻辑 CPU 核心(支持小数,底层基于 CFS 配额)
  • --cpu-shares=512:仅在 CPU 紧张时生效,表示该容器获得的 CPU 时间是默认值(1024)的一半
  • 对延迟敏感服务(如 API 网关),优先用 --cpus;对批处理类任务(如日志压缩),可用 --cpu-shares 配合低优先级调度

内存限制与 OOM 防护:防止“内存吃爆”拖垮整机

不设内存上限的容器在压力下可能触发宿主机 OOM Killer,误杀其他进程。必须显式指定 --memory:

  • --memory=512m:硬限制,超限后容器内进程被内核 OOM Killer 终止(容器退出)
  • 建议同时设置 --memory-swap=512m(禁用 swap)或 --memory-swap=1g(允许部分 swap),避免因 swap 滥用引发 I/O 飙升
  • Java 类应用需注意:JVM 堆内存(-Xmx)应明显小于 --memory 值,预留空间给元数据、线程栈、本地内存等

磁盘 I/O 与网络带宽可控化

批量日志写入或大文件传输容易打满磁盘吞吐或网卡,影响同宿主机其他容器:

  • 块设备限速:--device-read-bps /dev/sda:10mb --device-write-bps /dev/sda:5mb(按设备路径限速)
  • 网络限速(需启用 dockerd 的 userland-proxy=false 并依赖 host 网络命名空间):--network host 后用 tc 命令控制,或改用 macvlan 网络 + cgroup v2 的 net_cls/net_prio
  • 对日志密集型容器,挂载 tmpfs 卷(-v /var/log/myapp:/var/log/myapp:tmpfs,size=100m)减少落盘压力

宿主机协同:cgroup v2 与内核参数优化

Docker 依赖 Linux cgroup 进行资源控制。确保宿主机启用 cgroup v2(现代发行版默认开启),并验证:

  • 检查:stat -fc %T /sys/fs/cgroup 输出应为 cgroup2fs
  • 避免混用 cgroup v1/v2:确认 /proc/cmdline 中无 systemd.unified_cgroup_hierarchy=0
  • 关键内核参数调优:vm.swappiness=1(降低 swap 倾向)、vm.vfs_cache_pressure=50(缓存回收更保守),减少因内存压力引发的连锁 I/O 抖动
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

6787

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2808

6

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

6787

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2808

6

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

4738

6

k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

2023.07.24

805

4

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

6599

6

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

7737

6

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

3073

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习