网站运维:用python+pycurl检查网站性能指标

2018-09-1217:22:54后端程序开发Comments2,396 views字数 2198阅读模式

衡量一个网站的好坏有多个维度,但对运维人员来说站点的性能指标是我们比较关注的内容,从用户角度来说,最直观的感受就是用户输入网址后站点内容打开速度的快慢,那从一个用户发起请求到服务器,然后服务器响应提供给数据给客户端,了解http协议的小伙伴应该知道,这中间要经过多个步骤才能实现,所以说一个站点如果出现访问速度上的问题,要从整条链路上去查原因而不能只看某一方面,访问示意图如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

网站运维:用python+pycurl检查网站性能指标文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

在这个访问过程中我们会关注以下几个指标:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

  • DNS解析所消耗时间
  • 从建立连接到准备传输所消耗的时间
  • 从建立连接到传输开始消耗的时间
  • 传输结束所消耗的总时间
  • 平均下载速度
  • 返回的HTTP状态码

通过对以上几个指标的实时监测,当出现问题时就可以快速分析定位问题, 那如何获得这些数据呢,下面就要用到我们的pycurl了,Pycurl包是一个libcurl的Python接口,它是由C语言编写的,速度非常的快,下面看看我们的具体实现:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

import pycurl文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

import StringIO文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

def check(urls):文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    #if url not in errorurl:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    global HTTP_CODE,DNS_TIME,CONNECT_TIME,PRETRANSFER_TIME,STARTTRANSFER_TIME,TOTAL_TIME,SPEED_DOWNLOAD文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    url = 'http://' + str(urls)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    c = pycurl.Curl()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    c.setopt(pycurl.CONNECTTIMEOUT,5)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    c.setopt(pycurl.TIMEOUT,5)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    c.setopt(pycurl.NOPROGRESS,1)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    c.setopt(pycurl.FORBID_REUSE,1)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    c.setopt(pycurl.MAXREDIRS,3)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    c.setopt(pycurl.DNS_CACHE_TIMEOUT,30)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    c.setopt(c.URL, url)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    try:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        b = StringIO.StringIO()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        c.setopt(c.WRITEFUNCTION, b.write)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        c.perform()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        HTTP_CODE = c.getinfo(pycurl.HTTP_CODE)    #HTTP状态码文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        DNS_TIME = c.getinfo(c.NAMELOOKUP_TIME) * 1000  #DNS消耗时间文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        CONNECT_TIME = c.getinfo(c.CONNECT_TIME) * 1000  #建连消耗时间文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        PRETRANSFER_TIME = c.getinfo(c.PRETRANSFER_TIME) * 1000 #建连到准备传输消耗文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        STARTTRANSFER_TIME = c.getinfo(c.STARTTRANSFER_TIME) * 1000 #建连到传输消耗文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        TOTAL_TIME = c.getinfo(c.TOTAL_TIME) * 1000  #传输结束消耗时间文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        SPEED_DOWNLOAD = c.getinfo(c.SPEED_DOWNLOAD) #平均下载速度文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        b.close()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        c.close()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    except pycurl.error, error:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        pass文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        #errno, errstr = error文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

        #print 'An error occurred: ', errstr文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    return HTTP_CODE,DNS_TIME,CONNECT_TIME,PRETRANSFER_TIME,STARTTRANSFER_TIME,TOTAL_TIME,SPEED_DOWNLOAD文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

with open('site.txt','a+') as f:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    f.write('HTTP_CODE,DNS_TIME,CONNECT_TIME,PRETRANSFER_TIME,STARTTRANSFER_TIME,TOTAL_TIME,SPEED_DOWNLOAD' + '\n')文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    res = check('www.mindg.cn')文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

    f.write(str(res))

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

脚本里我只获取了一些比较核心的指标,当然pycurl功能不止这些,如果需要它还可以获取更细致的指标,例如:平均上传速度,HTTP头部大小等。有需要的小伙伴可以自己再研究下,脚本不做多解释了,关键行我加了注释, 最终获取的数据写入到了文本里,可以定时执行这个脚本来实时获取最新数据,这个脚本对要求不高的场景使用没啥问题,但对我们自动化运维来说只迈出了第一步而已,因为最好的方式是通过一个web页面去实时展示各个站点的情况,便于直观的观看,那要实现一个基本的站点,有几个问题我们需要我们思考去解决:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html

  1. 获取的数据要保存下来,就是有一个入库操作
  2. 随着站点的增加,后台运行,为效率考虑必须要用并发执行
  3. 前台方面:入库的数据要在前台展示,就需要用ajax
  4. 前台展示的页面要能主动自动刷新显示最新数据
  5. 前台入口需要提供一个用户添加url地址的表单
  6. 当然为好看,我们也要使用boostrap等类似的前端框架。
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4612.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/4612.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定