Linux操作系统高性能集群监控管理之道( 二 )


1.收集阶段
Linux有几种方法来进行系统统计 , 每种方法都各有其优缺点 。
◆ 使用现有的工具
标准及非标准工具能执行一个或多个收集、合并及传输阶段 , 如rstatd或SNMP工具 , 然而标准的rstat后台程序提供的信息是有限的 , 速度慢而且效率低 。
◆ 内核模块
几个系统监控工程利用内核模块来存取监控数据 。一般情况下 , 这是很有效的收集系统数据的方法 。然而这种方法存在的问题是 , 当主内核源内有其它改变时 , 必须保持代码一致性 。一个内核模块可能与用户想使用的其它内核模块相冲突 。此外 , 在使用监控系统之前 , 用户必须获得或申请模块 。
◆ /proc虚拟文件系统
/proc 虚拟文件系统是一个较快的、高效率执行系统监控的方法 。使用/proc的主要缺点是必须保持代码分析与/proc 文件格式改变的同步 。事实表明 , Linux内核的改变比/proc 文件格式的改变要更频繁 , 所以 , 用/proc虚拟文件系统比用内核模块存在的问题要少 。
◆ 混合系统
某些监控系统采用混合方式 , 用内核模块收集数据 , 用/proc虚拟文件系统作为数据接口 。
2.合并阶段
合并阶段的实现可以在结点上、集群管理的主机上 , 或者分布在两者上 。考虑到效率 , 我们只采用在结点上的合并 。原因在于结点是监控数据的收集器与提供者 。两个或多个同时的数据请求不会引起两次操作系统调用来收集数据 , 而是将第一次请求获得的数据缓存 , 并可以提供给第二次请求调用 。这种方法减少了操作系统的负担 , 提高了监控系统的响应性 。合并阶段也可以用于将多个数据源的数据以相互独立的收集速率结合 , 因为并不是所有的数据都以同样的速度改变 , 或者需要以同样的速率收集 。
使用在结点层上合并的另一个原因是 , 减少了包括传输在内的信息量 。许多/proc文件既包含动态数据也包含静态数据 。删除最近一次传输后没有改变的值 , 一个结点发送的数据量可以大大地减少 。合并不仅除去了不经常改变的动态值的传输 , 也解决了从不改变的静态值的传输 。
3.传输阶段
监控数据几乎总是按一个层次结构组织起来 。传输阶段的任务就是将层次数据进行有效的编码 , 形成一种能高效传输的数据格式 。Java拥有的文件格式是存储层次数据的有效方法 , 并且用提供的Java APIs很容易完成 。S-Expressions已经被认为是传输这种数据的另一个有效的方法 。
关于传输监控数据普遍讨论的问题是 , 数据应该按二进制编码还是按文本格式编码 。二进制数据更容易压缩 , 因此也能更有效地传输 。但是 , 当采用/proc文件系统时 , 监控数据通常以人们易读的格式存储 。在传输之前 , 将数据转换为二进制格式将需要更多的处理资源与时间 。以文本格式保留收集的数据 , 结点资源能被用于更多非监控性的相关工作 。
采用文本格式的数据将提供如下额外的益处:
◆ 平台独立性
当监控异构集群时 , 机器之间数据字节指令的配置不是永远相同的 。文本格式的使用在代码方面解决了这个问题 , 而且体系结构独立不会影响更多的处理需求 。
◆ 易读的格式
文本数据能以人们易读的格式进行组织 。如果需要的话 , 这种特征能容易地进行程序调试或允许用户观看数据流 。
◆ 有效压缩
数值数据的文本表示由来自10个字节集中的字符组成 , 而不是二进制下的256个字节集 。它们产生的数字及模式的相对频率允许有效地使用基于压缩算法的字典及熵(平均信息量) 。

推荐阅读