你必须知道的Docker资源限制
What is 资源限制?
默认情况下,容器是没有资源限制的,它会尽可能地使用宿主机能够分配给它的资源。Docker提供了一种控制分配多少量的内存、CPU或阻塞I/O给一个容器的方式,即通过在docker run或docker create命令时设置运行时配置的标志。
其中许多功能都要求您的内核支持Linux功能,可以通过docker info命令来检查是否支持,如果内核中禁用了某项功能,那你可能会在下边收到一条Warning。
docker-info
在Linux主机上,如果内核检测到没有足够的内存来执行重要的系统功能,它会抛出一个OOME(Out Of Memory Exception),一旦发生OOME,Linux就会开始查杀进程以释放内存。任何进程都有可能会被杀死,包括docker daemon和其他重要的应用程序。如果错误的进程被杀死,这可会降低整个系统的使用效果。
限制Docker使用内存
在Docker中可以强行限制容器的资源使用的限制,即只允许容器使用不超过给定数量的系统内存或其他软限制。下面介绍几个最常用的选项,我们可以在docker run或docker create创建容器时指定,用以限制容器的资源使用限制。
选项 | 描述 |
---|---|
-m 或 -memory= | 容器可以使用的最大内存量。如果你设置了此选项,那么允许的最小值为4m(4MB)。 |
--memory-swap | 允许此容器交换到磁盘的内存量。 |
--kernel-memory | 容器可以使用的最大内核内存量,允许的最小值是4m(4MB)。由于内核内存无法换出,因此内核内存不足的容器可能会阻塞主机资源,这可能会对主机和其他容器产生副作用。 |
限制Docker使用CPU
默认情况下,每个容器对主机CPU周期的访问权限是不受限制的。我们可以设置各种约束来限制给定容器访问主机的CPU周期。大多数用户使用和配置CFS调度程序(默认)或实时调度程序。下面介绍几个常用的选项,用于配置默认的CFS调度程序,以限制容器对于CPU的使用。
选项 | 描述 |
---|---|
--cpus= | 指定容器可以使用的可用CPU资源量,例如宿主机有4个CPU,那你可以给容器设置--cpus="3.5",则限制容器最多使用3.5个CPU。 |
--cpuset-cpus | 限制容器可以使用的特定CPU或核心,例如宿主机有4个CPU,那你可以给容器设置--cpuset-cpus="1,3",则限制容器只能使用第2个和第4个CPU。 |
验证Docker资源限制
(1)查看宿主机的资源信息
lscpu
free -h
可以看出,我是个穷逼,只买得起这个配置的云服务器(个人用)
(2)拉取用于压测的镜像
docker pull lorel/docker-stress-ng
更多关于docker-stress-ng镜像的说明请参考docker hub上的官方文档:https://hub.docker.com/r/lorel/docker-stress-ng/
(3)如果想要查看docker-stress-ng的用法,可以使用以下命令借助--help来获取选项的含义
docker run --name stress --rm lorel/docker-stress-ng:latest stress --help
在帮助文档中,给出了一个Example:
stress-ng --cpu 8 --io 4 --vm 2 --vm-bytes 128M --fork 4 --timeout 10s
下面是它的重要选项的说明:
- -c N, --cpu N 启动 N 个子进程( cpu )
- --vm N 启动 N 个进程对内存进行压测
- --vm-bytes 128M 每个子进程使用多少内存(默认 256M )
(4)测试内存使用限制
docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress --vm 2
说明:
- 限制内存使用最多256M
- 开启压测启动2个进程,每个进程使用256M(默认值)
验证:
docker stats stress
可以看到,无论启动多少个使用256M的进程做压测(这里启动了2个进程,按理会使用512MB内存),stress容器的最大内存使用量始终维持在256MB。
(5)测试CPU使用限制
docker run --name stress --rm --cpus 1 lorel/docker-stress-ng:latest stress --cpu 4
这里由于我的宿主机只有2个CPU,因此这里限制stress容器只能使用最多1个CPU,但是压测进程可以使用4个CPU。
验证:
docker stats stress
可以看到,无论压测的进程被允许使用多少个CPU,stress的CPU使用量始终在100%左右(存在一定误差是正常的)。
那么,如果我们不限制CPU呢?
docker run --name stress --rm lorel/docker-stress-ng:latest stress --cpu 4
从上图可知,stress容器会尽可能地吃掉尽可能多的CPU资源,由于宿主机只有2个CPU,因此原则上不会使用超过200%的CPU(当然,也会存在一定的误差,正常的)
小结
本文探索了Docker的资源限制相关知识,在日常开发中应该给容器设置一个合理的资源限制值,以防出现OOME的情况导致Linux杀掉错误的进程。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
小白如何选择阿里云服务器
云计算目前已经成为个人项目和创业公司的首选,上云大大降低了企业的 IT 和运维成本。很多个人和初创公司在选择阿里云服务器的时候,面对复杂的选项和配置时,可能不知道怎么选择。新购用户在选择服务器时,大都希望能够简单、快速、优惠地买对服务器,我想这应该是大部分新用户的诉求。 如何选择阿里云服务器阿里云 ECS 的购买页面如下,这里我以 1 核 2G 配置为例: 可以看到基础的配置项还是比较多的,需要选择基础的 ECS 规格、镜像、系统等配置。1 核 2G 可选的 ECS 规格有 3 类,分别为:突发性能 t5、共享计算型 n4、共享计算型 n1 这几种规格,简单介绍下这几种 ECS 实例。 突发性能 t5 属于入门级 x86 计算规格族群处理器:2.5 GHz 主频的 Intel Xeon E5-2682v4 / Intel Xeon(Skylake) Platinum 8163 处理器搭配 DDR4 内存适用场景 Web 应用服务器,WordPress、Tomcat 等轻负载应用、微服务开发测试压测服务应用共享计算型 n4 属于入门级 x86 计算规格族群处理器:2.5 GHz 主频的 ...
- 下一篇
docker部署gitlab-runner
1、配置启动脚本 version: '3.1' services: gitlab-ce: image: 'gitlab/gitlab-ce:latest' container_name: gitlab-ce restart: always hostname: 'gitlab.localhost.com' environment: GITLAB_OMNIBUS_CONFIG: | external_url 'http://192.168.31.109' # external_url是项目生成时的前缀域名 ports: - '80:80' - '443:443' - '10022:22' volumes: - '/root/gitlab-ce/home/config:/etc/gitlab' - '/root/gitlab-ce/home/logs:/var/log/gitlab' - '/root/gitlab-ce/home/data:/var/opt/gitlab' networks: - 'default' gitlab-runner: image: 'gitlab/gitlab-...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 2048小游戏-低调大师作品
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker安装Oracle12C,快速搭建Oracle学习环境