网站运维:用python+pycurl检查网站性能指标
衡量一个网站的好坏有多个维度,但对运维人员来说站点的性能指标是我们比较关注的内容,从用户角度来说,最直观的感受就是用户输入网址后站点内容打开速度的快慢,那从一个用户发起请求到服务器,然后服务器响应提供给数据给客户端,了解http协议的小伙伴应该知道,这中间要经过多个步骤才能实现,所以说一个站点如果出现访问速度上的问题,要从整条链路上去查原因而不能只看某一方面,访问示意图如下:
在这个访问过程中我们会关注以下几个指标:
- DNS解析所消耗时间
- 从建立连接到准备传输所消耗的时间
- 从建立连接到传输开始消耗的时间
- 传输结束所消耗的总时间
- 平均下载速度
- 返回的HTTP状态码
通过对以上几个指标的实时监测,当出现问题时就可以快速分析定位问题, 那如何获得这些数据呢,下面就要用到我们的pycurl了,Pycurl包是一个libcurl的Python接口,它是由C语言编写的,速度非常的快,下面看看我们的具体实现:
import pycurl
import StringIO
def check(urls): #if url not in errorurl: global HTTP_CODE,DNS_TIME,CONNECT_TIME,PRETRANSFER_TIME,STARTTRANSFER_TIME,TOTAL_TIME,SPEED_DOWNLOAD url = 'http://' + str(urls) c = pycurl.Curl() c.setopt(pycurl.CONNECTTIMEOUT,5) c.setopt(pycurl.TIMEOUT,5) c.setopt(pycurl.NOPROGRESS,1) c.setopt(pycurl.FORBID_REUSE,1) c.setopt(pycurl.MAXREDIRS,3) c.setopt(pycurl.DNS_CACHE_TIMEOUT,30) c.setopt(c.URL, url) try: b = StringIO.StringIO() c.setopt(c.WRITEFUNCTION, b.write) c.perform() HTTP_CODE = c.getinfo(pycurl.HTTP_CODE) #HTTP状态码 DNS_TIME = c.getinfo(c.NAMELOOKUP_TIME) * 1000 #DNS消耗时间 CONNECT_TIME = c.getinfo(c.CONNECT_TIME) * 1000 #建连消耗时间 PRETRANSFER_TIME = c.getinfo(c.PRETRANSFER_TIME) * 1000 #建连到准备传输消耗 STARTTRANSFER_TIME = c.getinfo(c.STARTTRANSFER_TIME) * 1000 #建连到传输消耗 TOTAL_TIME = c.getinfo(c.TOTAL_TIME) * 1000 #传输结束消耗时间 SPEED_DOWNLOAD = c.getinfo(c.SPEED_DOWNLOAD) #平均下载速度 b.close() c.close() except pycurl.error, error: pass #errno, errstr = error #print 'An error occurred: ', errstr return HTTP_CODE,DNS_TIME,CONNECT_TIME,PRETRANSFER_TIME,STARTTRANSFER_TIME,TOTAL_TIME,SPEED_DOWNLOAD
with open('site.txt','a+') as f: f.write('HTTP_CODE,DNS_TIME,CONNECT_TIME,PRETRANSFER_TIME,STARTTRANSFER_TIME,TOTAL_TIME,SPEED_DOWNLOAD' + '\n') res = check('www.mindg.cn') f.write(str(res)) |
脚本里我只获取了一些比较核心的指标,当然pycurl功能不止这些,如果需要它还可以获取更细致的指标,例如:平均上传速度,HTTP头部大小等。有需要的小伙伴可以自己再研究下,脚本不做多解释了,关键行我加了注释, 最终获取的数据写入到了文本里,可以定时执行这个脚本来实时获取最新数据,这个脚本对要求不高的场景使用没啥问题,但对我们自动化运维来说只迈出了第一步而已,因为最好的方式是通过一个web页面去实时展示各个站点的情况,便于直观的观看,那要实现一个基本的站点,有几个问题我们需要我们思考去解决:
- 获取的数据要保存下来,就是有一个入库操作
- 随着站点的增加,后台运行,为效率考虑必须要用并发执行
- 前台方面:入库的数据要在前台展示,就需要用ajax
- 前台展示的页面要能主动自动刷新显示最新数据
- 前台入口需要提供一个用户添加url地址的表单
- 当然为好看,我们也要使用boostrap等类似的前端框架。