Linux Carrier Grade Edition(CGE)平台的资源监测子系统可以提供RMON和资源监测器两种不同功能的系统资源监测包,利用这两种监测包可以对系统的资源实现正确的监测。本文介绍了这两种监测包的特点,并举例说明如何使用RMON。
在控制原理中,一个基本的原则是“没有经过测试的对象无法进行控制”。对于希望长时间连续工作的运营商级系统来说,该原则意味着必须对所使用的设备资源进行监测,以保证这些资源在任何时候的可用性,并确保系统不会超负荷工作。
在这里,运营商级Linux被定义为:能够满足《开放源代码开发实验室(OSDL)运营商级Linux要求定义》第1版要求的具有优先级属性的Linux。运营商级Linux要求提供一个资源监测子系统,该子系统能够监测磁盘、网络、CPU和存储器等的使用状况和过程状态。
本文将着重介绍MontaVista公司Linux Carrier Grade Edition(CGE)平台的资源监测特性,该平台是满足运营商级Linux绝大部分要求的商用化Linux产品。CGE提供的资源监测子系统可以提供两种不同功能的监测包,分别是RMON和资源监测器(Resource Monitor)。下面将就这两种监测包各自的优缺点加以讨论,同时举例说明如何使用RMON。
RMON能在内核中提供一种实时监测资源的功能,如RMON能够用来监测系统启动后产生的分支数量。为了有效地监测各类资源,RMON采用了计数器、量规(gauge)、统计值和门限值。计数器对单调增加的事件计数,比如接收到的以太网数据包数量;量规专门用于存储可以上下浮动的数值,如当前的任务数量;统计值是根据量规计算得出的一种数值,如每秒数据包数量;门限值则是统计值或量规,当达到门限值时系统将产生相关动作,如当统计值达到某个门限值时,RMON设备会从设备的read()调用中返回一些数据。下面的量规和计数器是作为CGE的一部分提供的。
基于以太网单接口或汇集数据的计数器和量规:
1. 接收到的数据包
2. 接收到的数据字节
3. 接收到的错误数
4. 已发送的数据包数
5. 已发送的字节数
6. 发送错误数
系统资源:
1. 当前空闲存储器页数
2. 当前进程数
3. 当前不活动的进程数
4. 创建的进程数
5. 当前的系统负载
用户也可以从用户空间(user-space)创建自己的资源,这些用户空间可以被其它用户空间或内核代码监测。在内核中具有完整的应用编程接口(API),该API能实现所有用户空间API可实现的功能,因此内核中的线程可以监测任何资源。
使用RMON
在使用RMON前,需要重新配置内核以使资源监测器工作。为了实现RMON,还需要实现内核中的资源监测支持功能,并重新构建内核。资源监测支持菜单选择位于操作系统中的内核调试和恢复部分。
在内核中的RMON被激活后,设计工程师就可以在驱动器资源代码中增加资源监测功能。
RMON规范
RMON API定义了两种基本的监测器类型,即计数值和量规。
计数值是单调增加的数值,例如写入磁盘的字节数量或接收到的以太网包数。计数值具有一个活动值和一个印象值,活动值是指当前计数的值,印象值是指已经保存过的前一计数值。可以用命令将活动值拷贝到印象值,也可以在最小的操作单位时间内将它置为零(不丢失任何计数值)。
量规是指那些数值可以上下浮动的值,比如系统中的进程数或系统当前正在使用的存储容量。量规可以设置为最大和最小值(对于某些量规来说这样做可能没有多少意义)。与计数值类似,量规也有一个活动值和一个印象值,印象值可以由命令获得,但与计数值不同的是,活动值不能被置为零。
统计值是一种监测值,可以附属于计数器和量规。统计值允许对原始的量规和计数值进行预处理。
计数器具有以下一些统计值:
速率:指一定时间内增量值的动态平均数。所报告的数值是在一段给定时间内的平均值,是根据时间乘以取样数量后的平均。例如,如果时间是1,000ms,取样数是10,那么报告的将是过去10秒内每秒的平均值。
漏桶(Leaky bucket):漏桶会周期性地用一个设定数对计数值递减。这使人们更容易发现那些可能具有峰值使用模式的计数器。
量规具有以下一些统计值:
高水印(high-water mark):自从上一个印象值后出现的最大量规值。
低水印:自从上一个印象值后出现的最小量规值。
统计值类似于从读取和即时观察角度来看的量规或计数器。
一个监测器可能会有多个实例,因此允许单个监测器内拥有多个计数器。例如,如果创建了一个“接收以太网字节数”的监测器,那么系统中的每个以太网卡都会有一个实例。此时虽然只有一个监测器,但有多个实例,并且每个实例都各自独立完成查询和计数。
当监测器和信号超过某一设定值时,门限值可以用来跟踪监测器和信号。当信号和监测器数值超过设定范围时(称为“打开”值),门限值就被激活。此外,还要给定另外一个范围(称为“关闭”值),只有处于关闭值范围内才能使门限无效。当监测值接近门限值并在不断上下浮动时,必须提供滞后效应来避免产生大量的门限事件。
监测器的实现
要想在驱动器中实现监测器,只需对RMON程序进行一些简单的调用即可。图1给出了实现光纤数据分布接口(FDDI)中接收数据包的计数监测器的代码片段。
设计师必须创建基本的监测器和该监测器的一个实例。实例标识符对每个实例来说必须是唯一的整数。图1所示代码假设系统中只有一块FDDI卡,更通常的做法是一块卡实现一个实例,而不是一个驱动器一个实例。
图2中的程序通过阅读上述实现的监测程序来检查数据包速率是否超过预先定义好的门限。
资源监测器
资源监测器为RMON提供另外一种监测子系统,对于Linux操作系统中的任何配置子系统来说,它能对统计值、门限值和量规值标记提供一致的计划性访问。资源监测器的结构主要由下面四部分组成:
用户程序(consumer):利用计划性访问的Linux应用程序。
资源监测器库:用户程序用于监测访问的接口。
资源监测后台程序(resourcemonitord):用于管理消费设备监测请求,并提供对统计值的连续监测的运行进程。
子系统监测库:后台程序用来查询统计值的特定子系统访问方法
资源监测器依赖于Linux事件记录系统,该记录系统提供能够记录所有系统事件的客户应用。无论何时,只要规则评估(rule evaluation)触发统计监测器,它都会产生事件记录,资源监测器可以使用事件记录系统提供的接口,同时资源监测器还提供了一种查询系统中可用统计数据的方法(称为发现)。
资源监测器也有一定的局限性。首先,Resourcemonitord需要轮询资源,因此资源监测并不是“实时的”;其次,支持完全独特的标识符需要使用EXT2文件特殊系统库和头包。
使用资源监测器
资源监测器初次安装时没有默认统计值需要监测,因此需要在驱动器源代码或用户应用代码中增加统计值。用于资源监测器的API完整描述(包括所需文件)已包含在Resourcemonitord包中。用户还需要配置并运行Resourcemonitord才能利用资源监测器,这样对系统统计值的资源监测功能就可以通过子系统库实现。资源监测器对Unix域套接字(domain socket)的使用会限制对本地资源(即同一节点上的资源)的监测。
作者:John Mehaffey
高可用性结构工程师
MontaVista Software公司
Email: mehaf@