高性能的Linux集群监控之道
用于将多个数据源的数据以相互独立的收集速率结合因为并不是所有的数据都以同样的速度改变或者需要以同样的速率收集
使用在结点层上合并的另一个原因是减少了包括传输在内的信息量许多/proc文件既包含动态数据也包含静态数据删除最近一次传输后没有改变的值一个结点发送的数据量可以大大地减少合并不仅除去了不经常改变的动态值的传输也解决了从不改变的静态值的传输
传输阶段
监控数据几乎总是按一个层次结构组织起来传输阶段的任务就是将层次数据进行有效的编码形成一种能高效传输的数据格式Java拥有的文件格式是存储层次数据的有效方法并且用提供的Java APIs很容易完成SExpressions已经被认为是传输这种数据的另一个有效的方法
关于传输监控数据普遍讨论的问题是数据应该按二进制编码还是按文本格式编码二进制数据更容易压缩因此也能更有效地传输但是当采用/proc文件系统时监控数据通常以人们易读的格式存储在传输之前将数据转换为二进制格式将需要更多的处理资源与时间以文本格式保留收集的数据结点资源能被用于更多非监控性的相关工作
采用文本格式的数据将提供如下额外的益处
◆ 平台独立性
当监控异构集群时机器之间数据字节指令的配置不是永远相同的文本格式的使用在代码方面解决了这个问题而且体系结构独立不会影响更多的处理需求
◆ 易读的格式
文本数据能以人们易读的格式进行组织如果需要的话这种特征能容易地进行程序调试或允许用户观看数据流
◆ 有效压缩
数值数据的文本表示由来自个字节集中的字符组成而不是二进制下的个字节集它们产生的数字及模式的相对频率允许有效地使用基于压缩算法的字典及熵(平均信息量)
/proc虚拟文件系统
/proc虚拟文件系统(也叫procfs)是Unix操作系统所使用的虚拟文件系统的Linux实现包括Sun SolarisLinuxBSD在/proc开始时它以一个标准文件系统出现并包含与正在运行的进程IDs同样名字的文件然而在/proc中的文件不占用磁盘空间它们存在于工作存储器(内存)中/proc最初的目的是便于进程信息的存取但是现在在Linux中它可被内核的每一部分使用来报告某些事情
在/proc文件系统提供的成百上千的值当中我们将集中考虑集群监控所需的最小集它们包括
◆ /proc/loadavg包含系统负载平均值;
◆ /proc/meminfo包含存储管理统计量;
◆ /proc/net/dev包含网卡度量;
◆ /proc/stat包含内核统计量;
◆ /proc/uptime包含总的系统正常工作时间及空闲时间
每个文件提供的值的数量是不同的这些文件的完整有效值列表如下
◆ /proc/loadavg提供以下数据
秒钟平均负载;
秒钟平均负载;
秒钟平均负载;
总作业数;
正在运行的作业总数
◆ /proc/meminfo提供的存储器信息包括
活动存储器;
不活动存储器;
缓冲存储器;
高速缓冲存储器;
总的自由存储器;
总的高位存储器;
自由高位存储器;
总的低位存储器;
自由低位存储器;
共享存储器;
交换存储器;
交换高速缓冲存储器;
交换自由存储器;
总存储器
◆ /proc/net/dev中包括每个网卡的如下数据
接收到的字节;
接收到的压缩字节;
收到的误码数;
收到的漏失误码;
收到的FIFO误码;
收到的帧误码;
收到的多播误码;
收到的总包数;
已传输的字节;
已传输的压缩字节;
传输误码总数;
传输载波误码;
传输冲突误码;
传输漏失误码;
传输FIFO误码;
传输的总包数
◆ /proc/stat提供
引导时间;
上下文切换数量;
中断总量;
进页面总数;
出页面总数;
进程总数;
换入总数;
换出总数;
合计CPU空闲时间;
合计CPU nice时间;
合计CPU系统时间;
合计CPU用户时间
同时提供对每个CPU的:
单个CPU空闲时间;
单个CPU nice时间;
单个CPU系统时间;
单个CPU用户时间
以及对每个磁盘驱动器的如下数据
单个磁盘块读;
单个磁盘块写;
单个磁盘I/O总数;
单个磁盘I/O读;
单个磁盘I/O写
◆ /proc/uptime中包括
系统总工作时间;
系统总空闲时间
值得注意的是每次某个/proc被读时一个句柄函数都被内核或特有模块调用来产生数据数据在运行中产生不管是读一个字符还是一个大的字块整个文件都将被重建这对效率是至关重要的一点因为使用/proc的任何系统监控器将吞下整个文件而不是一点一点地处理它
Java提供了丰富的文件I/O类集包括基于类的流基于类的块设备以及JSDK 提供的新的I/O库实验表明一般而言对基本的块读写文件操作用RandomAccessFile类进行I/O是最佳的例如块读文件操作如下
mFile = new RandomAccessFile( /proc/meminfo r );
//以读方式打开文件
mFileread( mBuffer ); //读文件块
结论
本文讨论了如何将Java语言有效地用于Linux集群结点上的高性能监控在程序设计中要注意以下方面
◆ 采用/proc文件系统;
◆ 以块形式读
- REDIce-Linux--灵活的实时Linux内核(11-12)
- linux文件系统基础(02-09)
- Linux标准趋向统一(11-12)
- linux基础技术(02-09)
- LINUX的目录树(02-09)
- 在Windows下启动Linux(02-09)