监控分为监控进程内部的状态(比如某一时刻接受了多少连接,进程内部某个变量的具体值)、及监控外部的状态(比如进程的cpu使用率、内存占用、磁盘、带宽),本文只讲监控内部状态。分布式系统中的每个长期运行的服务进程都应该内置一个监控接口,当进程运行出现异常时,通过这个探查通道,查看进程内部的状态,更好更快地确定异常产生的原因。
###监控进程内部状态的几种方式
-
日志
最常规的一种方法,一般成熟的编程语言都有开源的日志库,只需在代码中集成即可。日志通常用来分析程序执行的实际流程,从流程中判断bug产生的实际原因。日志也可以支持进程的容错(failure-tolerant),保存某一时刻开始的操作步骤,当进程崩溃重启后,可根据日志来恢复进程的内部状态。比如GFS(Google File System)中利用check-point 和 operate log来作为masterServer的容错机制。
如果要了解进程内部的具体状态(比如当前处理了多少请求,负载多少,进程中某个数据结构的状态)用日志推算是比较麻烦的,一般用下面三种方法来监控。 -
写文件
比较老土的方法,需要在程序执行过程中 状态改变时 输出打印到状态文件中。优点是简单快速,缺点是要控制写文件的频率。如果状态更新太快,要控制定时一段时间再写文件,但是在阅读文件时 文件的内容可能不是实时的。另外,如果想监控的数据结构较多,则要写的文件较多,管理麻烦。
注:也可以写到一个公共的存储(比如mysql, redis),不过有网络延时,写的频率不能太快。 -
内置一个httpServer服务
在程序中内置一个HTTP服务器,处理http请求。用http服务的好处有很多,比如可以远程访问,不必登录到目标机器。不需要特定的客户端支持,只需一个Web浏览器即可,也可以用脚本语言实现客户端,来自动化收集进程的状态数据。缺点是编程繁琐一些,需要网络库支持http服务,还要处理每个http请求在浏览器上的显示布局。 -
内置一个telnetServer服务
在程序中内置一个telnet服务器,接收各种命令。程序收到命令后,输出打印到telnet客户端。优缺点与上面的类似,但是编程更容易一些,容易集成到程序中。也不用考虑数据怎么布局、怎么显示,只需自己能看懂即可。
###开源一个telnet监控程序
在上家公司供职时,使用的网络库内置有一个telnet服务器,可以注册回调函数,来监视进程内部的状态。来到京东后,项目组没有类似的工具,所以自己实现了一个(已开源)。这个小工具在编程开发、debug、线上问题排查时,帮了我不少忙。
####功能
-
查看进程内部 数据结构的状态
在程序中注册、实现回调函数fun(输出某个数据结构的数据到telnet客户端),在登录到telnet时,输入命令”fun”,即会执行回调函数。在telnet窗口中可看到具体的数据。 -
修改执行的逻辑,或手动执行某个逻辑
在程序中设置一个开关,根据开关,程序在运行过程中 选择不同的执行逻辑。
####在项目中的使用
-
查看进程内部的状态
项目中有一个配置中心DcServer,管理各个server的互连状态(类似name service),所以在联调、出bug时,总要先查看整个系统各个server的互连状态。所以在DcServer中注册一个telnet回调函数:将当前所有server的连接状态输出到telnet窗口中。 -
手动执行一个函数
DcServer有一个任务,需要每天在00:30时,根据PreloadServer的个数,给所有PreloadServer分配任务。但是在系统部署的时候,不清楚是不是所有preloadServer都布上去了,所以在布署完后要手动分配任务。 -
联调阶段 模拟上游server 给自己发消息
在各个server联调阶段,通常需要根据传来的具体数据做相应的操作。但是如果上游server没有开发完相应的功能,但自己已经完成了相应的功能,需要调试。这时,可通过telnet命令 手动给自己发消息(模拟上游server的消息),来做相关的功能调试。
##参考