theme: orange
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
🤞 个人主页:@青Cheng序员石头
上文讲到了一个“容器”使用给的隔离技术 Linux Namespace,这篇文章带大家来认识一下“限制” Linux Cgroups。
Linux Cgroups
通过 Linux Namespace 可以创建一个“容器”,那么就够了吗?当然不够,我们通过隔离技术为容器规划了运行的空间,但是并未为其设定能够使用的资源范围,这样很容易造成容器相互之间频繁的竞争CPU、内存等资源。
举个极端的例子,建立在线程之间公平竞争基础上,容器所在的线程它能够使用到的计算和存储资源随时可能被宿主机抢占的一点不剩,也有可能容器所在的线程抢占了宿主机全部的计算和存储资源。
所以在Linux 内核上,Linux Cgroups 应运而生,其主要提供设置和限制资源的能力,Linux Cgroups 的全称是 Linux Control Group。它最主要的能力是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等,另外它还能够对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。
对于容器,使用它的能力当然是“限制”相关,Docker 使用CGroups实现资源的配额管理,包括 CPU,内存,网络的限制。
实践
CPU限制
根据Docker 官方文档,我们可以配置Linux CFS调度法来调整CPU的使用限制,比如: - --cpus=<value>
:限制容器可以使用多少cpu,可以设置为小数,该选项代表使用cpu的百分比,而不是具体的个数。
- --cpu-period=<value>
:指定cpu CFS的周期,通常和--cpu-quota一起使用,单位是us。
--cpu-quota=<value>
:指定容器在一个cpu CFS调度周期中可以使用cpu的时间,单位是us。--cpuset-cpus=<value>
:限制容器可以使用指定的cpu。--cpu-shares=<value>
:容器使用cpu的权重,默认值是1024,不设置或者将其设置为0都将使用默认值,数值越大权重越大。
对于CPU的限制,Docker的运行可以这样使用。 docker run -it --cpus=".5" nginx /bin/sh
注意:上面主要是CFS调度,除了这个,还有一个实时调度,其主要用于某些不能使用CFS调度的任务。
内存限制
-m= <value>
或--memory=<value>
:内存限制,最小值为6m。--memory-swap =<value>
:内存+交换分区的总限制,只有设置了-m之后,这个参数才有意义。--memory-swappiness=<value>
:默认情况下,容器的内核可以交换出一定比例的匿名页,此参数用来设置可用的比例。--memory-reservation=<value>
:是一种软性限制,确保容器不会长时间占用超过--memory-reservation限制的内存大小,但是不保证时时刻刻都不超过该限制值。--kernel-memory=<value>
:容器可以使用的最大内核内存值,最小值为4m--oom-kill-disable
:默认情况下,OOM错误发生时,主机会杀死容器进程来获取更多内存。
对于内存限制,Docker可以这样使用:
``` docker run -it --rm -m 100M --memory-swap -1 ubuntu-stress:latest /bin/bash
查看当前容器内存资源使用
docker stats
实时监控内存使用状态
top -p
```
上面讲到的非常浅显,有兴趣的可以参照 官方文档,详细了解对Memory, CPUs, and GPUs的限制。
少年,没看够?点击石头的详情介绍,随便点点看看,说不定有惊喜呢?欢迎支持点赞/关注/评论,有你们的支持是我更文最大的动力,多谢啦!