最近新功能上线,帮忙加了几个监控脚本。上次用的perl,语法太随意了,看起来很是不整洁,自己写的都觉得不好,更不要说给别人看。好久没用python了,反正这次准备使用新的监控设计方案,刚好换一下。
用perl写的是第一次做监控脚本,什么都不知道,看着别人的逻辑来写。觉得不是很好,一个脚本只监控一个功能,太多的重复工作和体力劳动,布置、统计也不方便。这次把它们都集中到一起,并抽象出黑箱监控的一些参数,一套东东搞定。其实逻辑很简单,就像下图所示。
麻烦的地方在于,以前是用socket做通信,这次为了方便,直接用python的库去做request。前后用了urllib2,httplib,httplib2。
urllib2在我的机器上建立连接用了1秒钟,要知道我用浏览器去访问总时间也不过几百ms(包括加载图片、CSS、JS等)。监控用的那台机python还是2.4,没有超时设置接口,用了一个计时器在超时的时候做close并在代码里捕获异常。最后还是因为太慢,转用httplib。
httplib建立一个就很快了,不过做request和read还是慢,要比浏览器慢上200到300ms。一样没有超时设置,发现httplib的read在开始的时候如果发现文件被关闭的话会返回长度为0的字符串,这个不是我所要的。自己去修改它的代码,加上了超时设置并在read的时候加上了异常。基本可以用,不过还是觉得在read的时候比较慢,估计是一些内存拷贝的算法太差。
实在受不了这种慢动作。用perl写的一个脚本实现同样功能要比这个快得多,后来找到一个httplib2,感觉对HTTP的支持要完善得多,另外也可以做超时设置(但似乎在read开始后就无效?)。
我的机器环境比较慢一点,三个库做同一个request所用的时间大概是:
urllib2 1.2s
httplib 800ms
httplib2 400ms
总结:
1)虽然python 2.4相同逻辑比perl慢,但因为代码风格比较好控制,后续还是尽量考虑使用python
2)不同的库实现不同,用python的时候注意在比较慢的情况下考虑使用其他库。