docker08(资源限制)

docker08(资源限制)

一.引子

上一篇我们提到了docker的写时复制的内容。主要是通过volume(卷)来进行管理。今天我们将要去了解docker的资源限制,为什么要做资源限制呢?就跟我们分系统盘一样,按需按量供给。如果不约束,那么一个docker容器使用的资源将无限被使用。那么系统将非常卡顿,甚至可能出发oome(Out Of Memory Exception)机制,随机杀死重要进程去释放内存。

二.docker的资源限制原理

(一).OOME机制

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

(二).Cgroup内核管理

cgroup是Control Groups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、memory、磁盘IO等等) 的机制,被LXC、docker等很多项目用于实现进程资源控制。cgroup将任意进程进行分组化管理的 Linux 内核功能。cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。

三.docker资源限制方式

docker利用cgroup主要进行内存,CPU以及网络I/O的限制。生产环境中主要对内存和CPU进行限制,由此我们只进行内存和CPU的限制实验

(一).docker限制内存(memory)

只需要在创建容器时添加以下选项就可以实现了。
在这里插入图片描述
测试命令:
docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress -vm 2(消耗内存资源,开另一个远程连接,docker stats查看)

(二).docker限制CPU

默认情况下,如果不对容器做任何限制,容器能够占用当前系统中的所有 CPU 资源
> 大多数进程是采用 CFS 调度算法(资源平均)
> 1.13 Docker 版本后支持实时调度算法
在这里插入图片描述
实验: docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8 (消耗CPU资源,开另一个远程连接,docker stats查看CPU资源消耗)

容器的资源限制还是非常简单的,只要我们了解docker创建的命令,在创建过程中添加资源限制命令就可以了。