专栏首页雪雁的专栏你可能不知道的Docker资源限制

你可能不知道的Docker资源限制

文章转载于公众号【恰同学骚年】,作者Edison Zhou

本篇内容涉及Docker的内存与CPU限制,可以用于在实际开发中为指定容器设置限制最大使用的资源量,预计阅读时间为5分钟

01

What is 资源限制?

默认情况下,容器是没有资源限制的,它会尽可能地使用宿主机能够分配给它的资源。Docker提供了一种控制分配多少量的内存、CPU或阻塞I/O给一个容器的方式,即通过在docker run或docker create命令时设置运行时配置的标志

其中许多功能都要求您的内核支持Linux功能,可以通过docker info命令来检查是否支持,如果内核中禁用了某项功能,那你可能会在下边收到一条Warning。

02

关于OOME

在Linux主机上,如果内核检测到没有足够的内存来执行重要的系统功能,它会抛出一个OOME 或者 Out Of Memory Exception,一旦发生OOME,Linux就会开始查杀进程以释放内存。任何进程都有可能会被杀死,包括docker daemon和其他重要的应用程序。如果错误的进程被杀死,这可会降低整个系统的使用效果。

03

限制Docker使用内存

在Docker中可以强行限制容器的资源使用的限制,即只允许容器使用不超过给定数量的系统内存或其他软限制。

下面介绍几个最常用的选项,我们可以在docker run或docker create创建容器时指定,用以限制容器的资源使用限制。

选项

描述

-m 或 -memory=

容器可以使用的最大内存量。如果你设置了此选项,那么允许的最小值为4m(4MB)。

--memory-swap

允许此容器交换到磁盘的内存量。

--kernel-memory

容器可以使用的最大内核内存量,允许的最小值是4m(4MB)。由于内核内存无法换出,因此内核内存不足的容器可能会阻塞主机资源,这可能会对主机和其他容器产生副作用。

04

限制Docker使用CPU

默认情况下,每个容器对主机CPU周期的访问权限是不受限制的。我们可以设置各种约束来限制给定容器访问主机的CPU周期。大多数用户使用和配置CFS调度程序(默认)或实时调度程序。

下面介绍几个常用的选项,用于配置默认的CFS调度程序,以限制容器对于CPU的使用。

选项

描述

--cpus=<value>

指定容器可以使用的可用CPU资源量,例如宿主机有4个CPU,那你可以给容器设置--cpus="3.5",则限制容器最多使用3.5个CPU。

--cpuset-cpus

限制容器可以使用的特定CPU或核心,例如宿主机有4个CPU,那你可以给容器设置--cpuset-cpus="1,3",则限制容器只能使用第2个和第4个CPU。

05

验证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(当然,也会存在一定的误差,正常的)

06

小结

本文探索了Docker的资源限制相关知识,在日常开发中应该给容器设置一个合理的资源限制值,以防出现OOME的情况导致Linux杀掉错误的进程。

参考资料:

(1)马哥,《Docker资源限制及验证》

(2)阿龙,《Docker的系统资源限制详解》

本文分享自微信公众号 - magiccodes(xl----0)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • %99的人都不知道的Docker技巧:优雅的终止容器

    如上的各种场景中,都要求打包在容器中的应用程序能够被优雅的终止(也即gracefully shutdown),这种gracefully shutdown的方式,...

    心莱科技雪雁
  • docker stack,docker-compose前世今生

      《docker-compose真香》详细讲述docker-compose容器编排工具的用法,实际上容器编排yml文件在进化到版本3的时候,docker-co...

    心莱科技雪雁
  • Docker最全教程——数据库容器化之持久保存数据(十二)

    上一节我们讲述了SQL Server容器化实践(注意,SQL Server现在也支持跨平台),本节将讲述如何持久保存数据,并且接下来将逐步讲解其他数据库(MyS...

    心莱科技雪雁
  • Docker 做资源限制

    默认情况下,一个容器是没有任何资源限制的,它能够耗尽当前主机内核能够调度给容器的所有资源,就像拥有饥饿者能力的猪头帝一样,永远吃不饱。这显然是不合理的,因为资源...

    用户5760343
  • 你可能不知道的Docker资源限制

      默认情况下,容器是没有资源限制的,它会尽可能地使用宿主机能够分配给它的资源。Docker提供了一种控制分配多少量的内存、CPU或阻塞I/O给一个容器的方式,...

    Edison Zhou
  • 用户凭啥要用小程序?我用 FOGG 模型分析了一下

    因为「优化」注定层出不穷,也导致其注定昙花一现。那么小程序是「app」形态的「优化」,还是一个和「app」完全不同的形态,是一种「颠覆」呢?

    知晓君
  • docker配置redis集群和scrapyd服务

    Redis集群的配置方式我们上一篇已经介绍过了,而且使用Dockerfile配置文件我们也介绍了,不过介绍的并不详细,可能有些人看不明白,这篇我们再介绍一些Do...

    星星在线
  • Docker的典型应用场景

    相对于VM,docker在其轻量、配置复杂度以及资源利用率方面有着明显的优势。 随着docker技术的不断成熟,越来越多的企业开始考虑通过docker来改进自己...

    小小科
  • 告诉你最简单的方式搭建MySQL、Redis、MongoDB数据库

    数据库在我们日常开发中接触是很多的,平时自己没事写一些东西也经常会用到,之前专门写过安装MySQL、Redis、MongoDB的文章,各种安装配置还是比较麻烦的...

    星星在线
  • Css3新特性总结之边框与背景(一)

    本系列主要总结Css3一些新特性的认识,来源于《css揭秘》书。 一、半透明边框 css3最好用hsla,而不是rgba,hsla是:h:颜色值(0~360);...

    sam dragon

扫码关注云+社区

领取腾讯云代金券