阿里云服务器多个网站,新沂网页设计,如何在后台做网站流程,从零做网站模板本篇内容涉及Docker的内存与CPU限制#xff0c;可以用于在实际开发中为指定容器设置限制最大使用的资源量#xff0c;预计阅读时间为5分钟。01—What is 资源限制#xff1f;默认情况下#xff0c;容器是没有资源限制的#xff0c;它会尽可能地使用宿主机能够分配给它的资… 本篇内容涉及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一旦发生OOMELinux就会开始查杀进程以释放内存。任何进程都有可能会被杀死包括docker daemon和其他重要的应用程序。如果错误的进程被杀死这可会降低整个系统的使用效果。03—限制Docker使用内存在Docker中可以强行限制容器的资源使用的限制即只允许容器使用不超过给定数量的系统内存或其他软限制。下面介绍几个最常用的选项我们可以在docker run或docker create创建容器时指定用以限制容器的资源使用限制。选项描述-m 或 -memory容器可以使用的最大内存量。如果你设置了此选项那么允许的最小值为4m4MB。--memory-swap允许此容器交换到磁盘的内存量。--kernel-memory容器可以使用的最大内核内存量允许的最小值是4m4MB。由于内核内存无法换出因此内核内存不足的容器可能会阻塞主机资源这可能会对主机和其他容器产生副作用。04—限制Docker使用CPU默认情况下每个容器对主机CPU周期的访问权限是不受限制的。我们可以设置各种约束来限制给定容器访问主机的CPU周期。大多数用户使用和配置CFS调度程序默认或实时调度程序。下面介绍几个常用的选项用于配置默认的CFS调度程序以限制容器对于CPU的使用。选项描述--cpusvalue指定容器可以使用的可用CPU资源量例如宿主机有4个CPU那你可以给容器设置--cpus3.5则限制容器最多使用3.5个CPU。--cpuset-cpus限制容器可以使用的特定CPU或核心例如宿主机有4个CPU那你可以给容器设置--cpuset-cpus1,3则限制容器只能使用第2个和第4个CPU。05—验证Docker资源限制1查看宿主机的资源信息lscpufree -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在帮助文档中给出了一个Examplestress-ng --cpu 8 --io 4 --vm 2 --vm-bytes 128M --fork 4 --timeout 10s下面是它的重要选项的说明4测试内存使用限制docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress --vm 2说明验证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可以看到无论压测的进程被允许使用多少个CPUstress的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的系统资源限制详解》恰童鞋骚年风华不再正茂仍想挥斥方遒点个在看少个bug ?