阿里巴巴DBA,原去哪儿网DBA。专注于MySQL源码研究、DBA运维、CGroup虚拟化及Linux Kernel源码研究等。 github:https://github.com/HengWang/ Email:king_wangheng@163.com 微博 :@王恒-Henry QQ :506437736
分类: LINUX
2012-11-29 22:56:33
目的
CGroup通过用户对资源的分配,对系统资源进行有效隔离的一种虚拟化处理方式。然而,尽管CGroup已经提供了一些列的工具,但是对于单个group的资源监控却没有提供很好的工具。为了使得对CGroup的资源进行更加详尽的、实时的监控,并且参考系统监控工具的实现,开发CGroup系统监控工具cgsysstat,对分配资源进行实时详尽的监控。
概要设计
CGroup监控工具cgsysstat基于cgroup的库libcgroup,参考系统Linux资源监控工具开发基于cgroup组的资源监控。
其中cgiostat工具主要对IO使用情况进行监控,类似iostat系统工具。主要对CPU(平均、详细)使用情况、IO使用情况进行统计和计算,根据输入的时间间隔和输出次数输出。主要的参数选项和输出格式也类似iostat,并根据cgroup与系统的不同之处,进行相应的调整。详细的说明参考一下说明内容。
cgfree工具主要用于内存资源的监控,类似free系统工具。主要对内存使用情况以及swap使用情况进行统计和计算,根据输入的时间间隔和输出次数输出。
cgvmstat工具主要用于详细的内存监控以及IO、CPU的监控信息,类似vmstat系统工具。对swap使用、内存使用、buffer、cache、inactive内存空间、active内存空间、IO的page in和page out、CPU的user、system、idle等统计信息进行监控。
cgiostat_ext工具是基于cgroup中进程的IO资源利用情况进行的统计,意在补充cgiostat的不足,但从目前来看,统计的信息不全面,且不准确,仅供参考。
详细设计
CGroup监控的统计信息主要包括CPU统计信息、IO统计信息、memory统计信息、进程统计信息四部分。通过这四部分,可以得到CPU的利用情况、IO吞吐情况、memory使用情况以及每个进程的详细统计信息。
对于每个Group来说,包含的统计信息包含在以上四部分中,为了分离Group的统计信息,设计了四个数据结构:cg_cpuset_stats_lists、cg_blkio_stats、cg_mem_stats和cg_proc_stats_lists。
cg_cpuset_stats_lists设计
cg_cpuset_stats_lists用于存储当前Group包含的CPU的信息,CPU分配情况根据CPUSET中当前Group分配的CPU信息获得。cg_cpuset_stats_lists是链表的头,给出了链表中对象的数目、第一个对象和最后一个对象,通过链表头,可以安全的遍历整个链表。对于每个cg_cpu_stats对象来说,它包含了CPU的id(由系统编号决定)、stats统计信息和指向下一个对象的指针。其中cpu_stats结构中包含了当前cpu的所有统计参数的值。详细设计如图所示:
图1 cg_cpuset_stats_lists结构设计
cg_blkio_stats设计
cg_blkio_stats用于存储当前Group的IO统计信息,主要是group全局的IO使用情况。因为IO的统计信息与系统设备有关,如8:0为sda磁盘的IO统计信息,并且可以获取多种设备的统计信息,因此根据设备的不同使用链式组织。其数据结构定义如下所示:
图2 cg_blkio_stats数据结构定义
由数据结构定义可知,cg_blkio_stats包含了IO的统计信息,由于IO的统计信息与设备相关。因此,以设备号和索引号作为唯一确定的统计信息,使用链表结构进行存储。cg_device_stats_lists和cg_device_value_lists是设备链表中的IO统计信息,不同的是,cg_device_stats_lists是有IO的read、write、sync、async统计信息,而cg_device_value_lists仅仅有一个统计值。
cg_device_stats_lists结构的设计如下图3所示。cg_device_stats_lists是链表头,cg_device_stats包含了实际的统计信息,链表中的不同节点以设备号dev和索引号idx来区别不同设备的统计信息。
图3 cg_device_stats_lists结构设计
cg_device_value_lists结构的设计如下图4所示。设计同cg_device_stats_lists结构类似,不同之处是统计信息只有一个统计值。
图4 cg_device_stats_lists结构设计
cg_mem_stats设计
cg_mem_stats存储当前group的内存统计信息。具体的数据结构定义如下图5所示,其中stat是mem_stats统计的信息包括cache、page页的换入/换出、swap使用、inactive内存、active内存等信息。
图5 cg_mem_stats数据结构定义
cg_proc_stats_lists设计
cg_proc_stats_lists存储了与进程相关的统计信息。每个进程的cg_proc_stats都包括进程的IO统计信息、stat统计信息以及statm统计信息。具体的设计如下图6所示:
图6 cg_proc_stats_lists结构设计
其中,io_stats信息是进程的IO统计信息,信息来源于/proc/
基于以上四种不同结构的设计,组成group的组信息。 cg_group_lists是group组的链表头信息,cg_group存储了Group组的所有信息,根据group名,进行区分不同组的统计信息。cg_group中包含group的name、group的路径、cg_cpu_stats_lists统计CPU信息列表的数组cpuset_stats[2]、cg_blkio_stats统计IO信息的数组blkio_stats[2]、cg_mem_stats统计memory信息的数组mem_stats[2]以及cg_proc_stats_lists统计进程信息列表的数组proc_stats[2]。之所以定义为长度为2的数组,是因为统计信息是一个累计值,所以需要计算两次统计信息的差值,得到当前时间的资源利用情况。详细设计如下图7所示:
图7 cg_group_lists结构设计
通过以上统计信息,就可以对当前group的统计信息进行计算,根据不同的输出需求,输出group的资源利用情况。
总结
通过cgsysstat对group内的CPU统计信息、IO统计信息、Memory统计信息以及group包含的每个进程的统计信息进行计算,根据要求,就可以格式化输出相应的统计资源。具体各个工具的使用说明文档,请参照《CGroup监控工具—使用说明文档》。