
1.4.2 控制组
Linux上的Docker引擎还依赖控制组(Control Group,Cgroup)这种底层技术。控制组的设计目标是为从控制单一进程到系统级虚拟化的不同情形提供统一的接口。
1.什么是控制组
控制组是Linux内核提供的可以限制、审计、隔离进程组(一个或多个进程的集合)所使用的物理资源(如CPU、内存、I/O等)的一种机制。也就是说,Linux可以通过控制组设置进程使用CPU、内存和I/O资源的限额。Linux上的Docker引擎正是依赖这种底层技术来限制容器使用的资源的。
每个控制组就是一组按照某种标准划分的进程。控制组中的资源控制都是以控制组为单位实现的。一个进程可以加入某个控制组,也可以从一个控制组迁移到另一个控制组。进程可以使用以控制组为单位分配的资源,同时受到以控制组为单位设定的资源限制。控制组也可以继承,这意味着一个子组可以继承其父组设定的资源限制。
2.控制组的功能
控制组主要用来对共享资源进行隔离、限制、审计等,具体功能列举如下。
● 资源限制:可以为控制组设置对CPU、内存和存储空间的使用限制。
● 优先级:通过设置让一些控制组优先得到更多的CPU或者磁盘I/O等资源。
● 资源审计:一个控制组的资源使用情况会被监测和计量。
● 隔离:为控制组隔离名称空间,让一个控制组不能访问另一个控制组的进程、网络连接和文件系统。
● 控制:可以对进程组执行挂起、恢复和重启等操作。
3.Docker使用控制组
控制组是Docker实现虚拟化所使用的资源管理手段,可以说没有控制组就没有Docker。在Docker中,每个容器都是相互隔离的一个或一组进程,可以作为一个控制组。
控制组可以对容器的内存、CPU、磁盘I/O等资源进行限制和审计管理。控制组限制应用程序只能访问指定的资源,让Docker引擎在容器之间共享可用的硬件资源,并可以选择强制实施限制和约束。例如,可以对某个容器限制可用的内存资源。
对容器使用的内存、CPU和I/O资源的限制具体是由控制组的相应子系统来实现的。只有能控制分配到容器的资源,才能避免多个容器同时运行时对主机系统的资源竞争。