linux 容器(LXC) 第4章 cgroups

转:https://blog.csdn.net/caoshuming_500/article/details/51682811

1. cgroups 的简介

cgroups (control groups) 是linux 内核提供的一种可以分配给单个进程和多个进程资源,并可以对cpu、mem(io、disk、traffic 现在应该还不支持)进行精细化控制。比如一台处理机有32core 128G内存;这台机器设置最多跑6个application(进程);1个进程申请 8core 20G;1个进程申请16core  64G;1个进程申请 2core 8G 等等,这些都可以通过cgroups 进行按需分配(前提是机器还有资源),如果这台机器没有那调度系统会分配其他的处理机器


2. cgroups 的概念和原理

cgroups 为每种可以精细化控制的资源定义了一个子系统,典型的子系统如下:

  • cpu 子系统: 主要限制进程cpu的使用率(也可以理解为限制分配给cpu的core,最终限制是cpu 利用率的限制;比如一共32core 分配4core ,那这个进程cpu 最大占用率 = 12.5%,所以一个进程可以申请< 1core,因为最后是转换成比率来控制的
  • cpuacct 子系统:统计每个进程cpu 使用率的报告,如果达到预定的上限,可以采取一定的措施
  • cpuset 子系统:可以为进程分配单独的cpu节点或者mem节点,可以理解为为进程分配指定的额cpu占有率,就是精细化控制cpu资源
  • memery 子系统:可以限制进程memery 最大的使用量
  • blkio 子系统:可以限制进程访问的块设备io
  • device 子系统:可以控制访问的设备
  • net_cls 子系统:标记cgroups 中的网络数据包,然后可以使用tc模块(traffice control) 系统对数据包进行控制;比如namespace NET 的可以通过这个系统让namespace 内进程可以独立进行网络通信,功能类似于自己单独的网卡、单独的带宽
  • freezer 子系统,可以stop或者start cgroups 管理的进程,就是监控进程的状态,如果设置了一直是start状态,就去确定环境是否是ok,如果ok就启动服务
  • ns子系统: 可以控制cgroup的进程访问不同的namespace;这个配合namespace的功能实现容器的隔离效果

这里每一个子系统都需要跟内核的其他模块配合来完成资源的控制,比如对cpu资源的控制,需要内核的进程调度模块根据cpu子系统的配置来完成;内存资源的限制需要内核的内存模块根据memery子系统的配置来完成。

上面是说的cgroups 是内核提供的功能,但现在我们在用户空间想使用cgroup的功能;具体实现的原理就是:内核通过cgoups 文件系统把内存的cgroups 功能提供给用户程序,用户程序通过调用cgroups API 来实现内核的cgroups 功能

3. cgroups 文件系统

lilnux 系统如何让用户态的进程使用cgroups的功能呢;linux 内核有一个很强大的模块叫做VFS(vritual File System),VFS 把具体的文件系统的细节隐藏起来,给用户态进程提供一个完备的文件系统API接口。linux 也是通过VFS 把cgroups 功能暴漏给用户态进程的,cgroups 与VFS 之间的衔接部分叫做cgroups 文件系统。

用户态进程对groups 文件系统的操作,通过VFS 转换成cgroups 层级结构的维护。

猜你喜欢

转载自blog.csdn.net/caofengtao1314/article/details/81381503