• 热门搜索 热门搜索
菜单

您现在的位置是:博客 > 文章详情文章详情

Docker容器的资源大小限制(CPU、内存、磁盘)

原创
时间2024/04/17 10:20:52 发布 预览数量1033
分类: docker linux 标签: linux Docker

一、前言

Docker 容器的资源分配往往是最容易被人忽略的参数点,一般情况下不会有太大问题,但是只要出现问题就是灾难性的。

如果 Docker 容器在创建时没有明确设置 --memory 参数,那么它的内存限制将取决于操作系统和 Docker 引擎的默认配置。在某些情况下,如果没有明确设置内存限制,容器可能会尝试使用尽可能多的可用内存,这可能会导致性能问题或资源争用。

这似乎看上去并没有什么太大的问题,然而在Linux系统中,如果内核检测到没有足够的内存来执行重要的系统功能,它会抛出OOME或Out Of Memory Exception,并开始杀死进程以释放内存。任何进程都可能被杀死,包括Docker和其他重要的应用程序。假如某个容器因为内存占用太多,导致容器被Linux 干掉。假如恰巧这个容器是数据库~~~~

人生没有那么多假如,但我们需要防患于未然。

二、Docker 容器资源设置

在系统中,CPU、内存、硬盘、读取 IO 资源等等,都属于系统的硬件资源。硬件的资源是有限的,所以我要避免因占⽤太多资源⽽影响其他容器乃⾄整个 host 的性能。这里容器的资源分配就非常重要了。

官方文档地址:
docker run —memory

为了方便验证下述演示效果,推荐使用使⽤ progrium/stress 镜像来模拟容器内存占用。该镜像可⽤于对容器执⾏压⼒测试。docker官方文档地址:progrium/stress

1、内存大小设置

Docker容器内存限额与Linux操作系统类似,可使⽤的内存包括两部分:物理内存和 swap(虚拟内存)。 Docker 可以通过下⾯两组参数来控制容器内存的使⽤量。

-m 或者--memory:设置内存的使用限额,例如10M,1G(最小可以设置6M)。
--memory-swap:设置内存+swap的使用限额。

举例:

# --vm:启动 1 个内存⼯作线程
# --vm-bytes:每个工作线程分配的内存大小

docker run -it -m 200M --memory-swap=300M  progrium/stress  --vm 1 --vm-bytes 100M

因为100M没有超过 --memory-swap的大小,所以工作线程能够正常工作,输出如下所示:

[root@t224yuntu1 ~]# docker run -it -m 200M --memory-swap=300M  progrium/stress  --vm 1 --vm-bytes 100M
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogvm worker 1 [7] forked
stress: dbug: [7] allocating 104857600 bytes ...
stress: dbug: [7] touching bytes in strides of 4096 bytes ...
stress: dbug: [7] freed 104857600 bytes
stress: dbug: [7] allocating 104857600 bytes ...
stress: dbug: [7] touching bytes in strides of 4096 bytes ...
stress: dbug: [7] freed 104857600 bytes
stress: dbug: [7] allocating 104857600 bytes ...
stress: dbug: [7] touching bytes in strides of 4096 bytes ...
stress: dbug: [7] freed 104857600 bytes
stress: dbug: [7] allocating 104857600 bytes ...
stress: dbug: [7] touching bytes in strides of 4096 bytes ...
stress: dbug: [7] freed 104857600 bytes
......

如果执行下面的指令, 就会报错:

docker run -it -m 200M --memory-swap=300M  progrium/stress  --vm 1 --vm-bytes 250M

错误日志如下所示

[root@t224yuntu1 ~]# docker run -it -m 200M --memory-swap=300M  progrium/stress  --vm 1 --vm-bytes 250M
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogvm worker 1 [7] forked
stress: dbug: [7] allocating 262144000 bytes ...
stress: dbug: [7] touching bytes in strides of 4096 bytes ...
stress: FAIL: [1] (416) <-- worker 7 got signal 9
stress: WARN: [1] (418) now reaping child worker processes
stress: FAIL: [1] (422) kill error: No such process
stress: FAIL: [1] (452) failed run completed in 1s

2、CPU大小设置

默认设置下,所有容器可以平等地使⽤CPU 资源并且没有大小限制。但是我们可以通过--cpu-c 参数在 Docker 中限制容器使用的 CPU 数量或限制 CPU 使用的核心数。

  • --cpu 参数允许您指定容器可以使用的 CPU 数量。它接受一个整数值作为参数,表示容器可以使用的 CPU 数量。例如:--cpu=2将限制容器使用两个 CPU。
  • -c 参数来限制容器使用的 CPU 核心数。-c 参数后面跟着一个数字,表示容器可以使用的 CPU 核心数。例如,-c=2 将限制容器使用两个 CPU 核心

举例:

docker run --name converts -it -c 1024 progrium/stress --cpu 2

结果日志输出:

[root@t224yuntu1 ~]# docker run --name converts -it -c 1024 progrium/stress --cpu 2
stress: info: [1] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 6000us
stress: dbug: [1] --> hogcpu worker 2 [7] forked
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogcpu worker 1 [8] forked

3、读写IO大小设置

默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight 参数来改变容器 block IO 的优先级。取值范围是 10~1000 。由于读取IO不是很好测试,这里就不展开了。有兴趣的小伙伴可以自己去模拟测试。

版权声明:本文为Converts的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://www.converts.cn/article/7798213.html

暂无评论

暂无评论

目录

推荐阅读

  • .net 项目发布中的 Debug和Release的区别是什么?

    ![.net 项目发布中的 Debug和Release的区别是什么?](/ArticleFile/2023-09-09/93b4042444ff40aba6e7c913250e425f.png '.net 项目发布中的 Debug和Release的区别是什么?') 一、Debug 版本 Debug 是“调试”的意思,

  • Vs2022 设置类、接口默认创建的模板

    一、前言 在团队协作中,每个人都负责这自己模块的代码。为了清楚的分辨代码是谁开发的, 我们往往会在类、接口增加一个额外的注释信息,例如:创建人、创建时间、描述等等。所以有些时候,我们希望 visual Studio 在创建类,接口的时候,生成的代码文件能更丰富一下, 例如:自动增加基础的注释功能, 类文件自动增加 p

  • 如何使用 vs 2022 远程调试 Linux系统中的Docker容器项目

    一、前言 在项目上,总会遇到一些奇怪的问题,例如:“在本地好好的, 为什么部署到线上就不行” 等等,这样的问题时长困扰着我们。但是作为一个资深的码农,“远程调试” 是一个不可或缺的手段。下面就来看下如果使用 vs 在本地远程调试部署在Linux系统中,运行在Docker容器中的项目吧。 二、远程调试 调试的前提,

  • 移除Linux系统启动时的等待时间

    一、前言 VMware 虚拟机中安装了很多Linux 系统,每次启动的时候, 都卡在系统选择的界面上,除非手动选择, 否则要等很久才会进入系统,如下图所示: ![移除Linux系统启动时的等待时间](/ArticleFile/2024-06-24/e3ab02212cc946bd9c23159895177fb3.png '移除Linux系统启动时的等待时间') 二、关闭系统等待的事件 我们

  • GitLab 私有化部署

    一、GitLab 概述 git作为目前最流行的代码管理工具,已经成为了程序员必备的技能。虽然目前有 github(对国人不太友好) 、gitee 两个比较大的代码托管平台。但是出于各种原因,搭建自己的私有代码平台也成了一部分开发人员的选择。针对这种需求,这里为大家介绍的是其中的佼佼者gitlab,也是我们公司内部正在使用的一个代码管理平台。 GitLab是一个基于Git的开源代码管理平台,它

  • 云服务器购买按量付费实例,并搭建私有网络图解

    一、前言 最近在自学 k8s 集群化部署, 奈何云服务器包年包月太贵了, 学习成本飙升。好在各大云服务商支持按量计费 , 接下来就带大家一起过一下购买流程,并且使用私有网络。 二、私有网络 在购买云服务器之前,先了解下什么是私有网络。官网给出的解释是:私有网络(Virtual Private Cloud,VPC)是一块在云服务器上自定义的逻辑隔离网络空间,可以使云服务器, 云数据库资源构建逻

  • Docker 部署FastTunnel,实现内网穿透

    一、前言 最近在学习搭建Elasticsearch集群,但是发现云服务(2核4G)资源根本就不够用,部署上去就直接宕机了。想着服务器资源太贵, 家里刚好有一台64G内存的闲置电脑。不如做一个内网穿透,可以远程访问。工作学习两不误。其实目前市面上已经有很多穿透工具了,比如向日葵~~ ,但是奈何带宽太小了,免费的才1M~~~ 二、什么是 FastTunnel FastTunnel 是用.net

  • IP地址和子网掩码的关系

    一、概述 IP地址(Internet Protocol Address)和子网掩码(Subnet Mask)是计算机网络中两个核心的概念,它们共同工作以确保数据能够正确地在复杂的网络环境中传输到目标设备。 二、IP地址 `IP地址`是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。它是一个32位的二进制数,但是在习惯上,我们

  • 修改Docker默认的存储驱动程序目录

    一、前言 今天使用jenkins对程序进行更新的时候,发现更新失败。经排查是因为系统磁盘满了,然而通过堡垒机看了下,系统空间还有很多,于是看了下系统分区: ![修改Docker默认的存储驱动程序目录](/ArticleFile/2024-06-06/444ede8a1b1b42058db18690fa995952.png '修改Docker默认的存储驱动程序目录') ![修改Docker默认

  • Windows 安装git的详细安装步骤 ,以及TortoiseGit 图形化工具

    一、前言 `Git` 是一个开源的分布式版本控制系统,用于有效、高速地处理从很小到非常大的项目版本管理。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不需要服务器端软件支持。 二、安装Git 1、Git 下载地址 [Git 下载地址](https://git-scm.com/downloads "Git 下载地址") ![Windows

加载中