网站运维:用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页面去实时展示各个站点的情况,便于直观的观看,那要实现一个基本的站点,有几个问题我们需要我们思考去解决:

  1. 获取的数据要保存下来,就是有一个入库操作
  2. 随着站点的增加,后台运行,为效率考虑必须要用并发执行
  3. 前台方面:入库的数据要在前台展示,就需要用ajax
  4. 前台展示的页面要能主动自动刷新显示最新数据
  5. 前台入口需要提供一个用户添加url地址的表单
  6. 当然为好看,我们也要使用boostrap等类似的前端框架。
THE END