admin 管理员组

文章数量: 1184232


2024年3月25日发(作者:element品牌介绍)

Docker的内核,性能与调优

首先我们抛出3个问题:

1.

docker容器的内核与宿主机内核是怎样的关系?

2.

容器在运行时如何调用系统资源?

3.

docker的性能参数有没有作用范围?

能够将这3个问题全部解答,关于docker的内核与调优策略

便有了一定程度的认识。

一、容器与宿主机的内核关系 —— 共享内核

docker镜像是一个“应用程序和它运行依赖环境”的封装。

当镜像运行起来后,即是docker容器。运行时的容器本质是

操作系统下的一个进程,这些进程共享同一个宿主机OS的内

核。

与传统VM相比,docker是一种操作系统虚拟化技术,并不需

要在镜像内安装GuestOS。

docker在共享宿主机内核的基础上包装内核提供的一系列

API,这些API中最重要的就是namespace和cgroup。通过

namespace实现隔离,通过cgroup实现资源限制。

二、Namespace--命名空间

PIDnamespace:每当在此空间中启动一个程序,内核就

给它分配唯一的ID。与宿主机所见的不同,容器内的进

程都有自己的进程ID空间。

MNTnamespace:每个容器都有自己目录挂载的命名空

间。

NETnamespace:每个容器都有自己单独的网络栈,其中

的socket和网卡设备都是其他容器不能访问的。

UTSnamespace:在此命名空间中的进程拥有自己的主机

名和NIS域名。

IPCnamespace:拥有相同IPC命名空间的进程才可以利

用“共享内存、信号量、消息队列”方式进行通信。

User namespace:用于隔离容器中的UID,GID和根目录

三、Cgroup--控制组

顾名思义,控制和分组是用来对进程进行分层分组,在组的粒

度上实现资源限制和策略控制。每个容器中的进程都由组策略

控制。

Cgroup包含了很多控制器。

Cgroup对进程分组的控制是通过一个虚拟文件系统下的目录

节点和节点文件实现的,控制器是目录节点中的文件,文件内

容规定了系统资源的配额。

以全局cgroup为例 # ls /sys/fs/cgroup

默认的情况下,docker会在这些目录下面创建自己的节点子

目录,而每个容器都会创建自己容器ID的节点子目录;这些

目录都包含了对应层次的控制器文件,用于控制每一级的资源

配额。下文简述一些控制器的功能:

cpu:限制组中进程的cpu使用量

cpuacct:对进程的CPU使用程度进行计量

memory:限制组中进程的内存使用量,并计量

blkio:限制组中进程对块设备的IO操作

net_prio:用于设置组相关网络包的优先级

hugetlb:用于限制和报告组内进程对大页面的使用量

freezer:用于组内进程的挂起和解冻


本文标签: 进程 容器 内核 运行 限制