首页 技术 正文
技术 2022年11月9日
0 收藏 751 点赞 2,570 浏览 2305 个字

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。

What is 资源限制?

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

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

你可能不知道的Docker资源限制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=<value> 指定容器可以使用的可用CPU资源量,例如宿主机有4个CPU,那你可以给容器设置–cpus=”3.5″,则限制容器最多使用3.5个CPU。
–cpuset-cpus 限制容器可以使用的特定CPU或核心,例如宿主机有4个CPU,那你可以给容器设置–cpuset-cpus=”1,3″,则限制容器只能使用第2个和第4个CPU。

验证Docker资源限制

  (1)查看宿主机的资源信息

lscpu

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

free -h

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

可以看出,我是个穷逼,只买得起这个配置的云服务器(个人用)

  (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

 你可能不知道的Docker资源限制  在帮助文档中,给出了一个Example:

stress-ng --cpu  --io  --vm  --vm-bytes 128M --fork  --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 

  说明:

  • 限制内存使用最多256M
  • 开启压测启动2个进程,每个进程使用256M(默认值)

  验证:

docker stats stress

 你可能不知道的Docker资源限制  可以看到,无论启动多少个使用256M的进程做压测(这里启动了2个进程,按理会使用512MB内存),stress容器的最大内存使用量始终维持在256MB。  (5)测试CPU使用限制

docker run --name stress --rm --cpus  lorel/docker-stress-ng:latest stress --cpu 

  这里由于我的宿主机只有2个CPU,因此这里限制stress容器只能使用最多1个CPU,但是压测进程可以使用4个CPU。  验证:

docker stats stress

 你可能不知道的Docker资源限制  可以看到,无论压测的进程被允许使用多少个CPU,stress的CPU使用量始终在100%左右(存在一定误差是正常的)。那么,如果我们不限制CPU呢?

docker run --name stress --rm lorel/docker-stress-ng:latest stress --cpu 

 你可能不知道的Docker资源限制  从上图可知,stress容器会尽可能地吃掉尽可能多的CPU资源,由于宿主机只有2个CPU,因此原则上不会使用超过200%的CPU(当然,也会存在一定的误差,正常的)

小结

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

参考资料

(1)马哥,《Docker资源限制及验证》(2)阿龙,《Docker的系统资源限制详解

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,487
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,486
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,126
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,287