pycurl检测网站性能,pycurl.*_TIME时间问题
来源:互联网 发布:php商城开发流程 编辑:程序博客网 时间:2024/06/07 05:49
今天使用python+pycurl来检测网站性能,使用curl_obj.getinfo(pycurl.*_TIME)来获取各个阶段运行时间
total_time = curl_obj.getinfo(pycurl.TOTAL_TIME)#传输结束所消耗的总时间dns_time = curl_obj.getinfo(pycurl.NAMELOOKUP_TIME)#从发起请求到DNS解析完成所消耗的时间connect_time = curl_obj.getinfo(pycurl.CONNECT_TIME)#从发起请求到建立连接所消耗的时间redirect_time = curl_obj.getinfo(pycurl.REDIRECT_TIME)#从发起请求到重定向所消耗的时间ssl_time = curl_obj.getinfo(pycurl.APPCONNECT_TIME) #从发起请求到SSL建立握手时间pretrans_time = curl_obj.getinfo(pycurl.PRETRANSFER_TIME)#从发起请求到准备传输所消耗的时间starttrans_time = curl_obj.getinfo(pycurl.STARTTRANSFER_TIME) #从发起请求到接收第一个字节的时间
最后发现,dns_time+connect_time+......+starttrans_time远远大于total_time。
查看man curl(pycurl基于curl开发的),发现各个阶段时间是从客户端发起URL请求时到某个阶段的时间差,而不是某个阶段开始时间到结束时间差。
为了求得某个阶段的执行时间,需要对这些值进行计算。
pycurl的各个阶段(根据pycurl.*_TIME统计)依次为
DNS解析-->TCP连接-->跳转【如有】-->SSL握手【如有】-->客户端准备-->服务器响应-->数据传输
代码如下:
#! /usr/bin/python#coding:utf-8#-*- coding : utf-8 -*-import sys,pycurlrequest_url = sys.argv[1]curl_obj = pycurl.Curl()#创建一个curl对象curl_obj.setopt(pycurl.CONNECTTIMEOUT, 5)#连接的等待时间,设置为0则不等待curl_obj.setopt(pycurl.TIMEOUT, 5)#最大下載时间curl_obj.setopt(pycurl.NOPROGRESS, 1)#是否屏蔽下载进度条,非0则屏蔽curl_obj.setopt(pycurl.MAXREDIRS, 0) #指定HTTP重定向的最大数curl_obj.setopt(pycurl.FORBID_REUSE, 1)#完成交互后强制断开连接,不重用curl_obj.setopt(pycurl.FRESH_CONNECT,1)#强制获取新的连接,即替代缓存中的连接curl_obj.setopt(pycurl.DNS_CACHE_TIMEOUT,1)#设置保存DNS信息的时间,默认为120秒curl_obj.setopt(pycurl.URL,request_url)#指定请求的URLimport StringIOstrio = StringIO.StringIO()curl_obj.setopt(pycurl.WRITEFUNCTION, strio.write)try : curl_obj.perform() err_mess = ''except Exception as e: err_mess = str(e)#访问页面total_time = curl_obj.getinfo(pycurl.TOTAL_TIME)#传输结束所消耗的总时间dns_time = curl_obj.getinfo(pycurl.NAMELOOKUP_TIME)#从发起请求到DNS解析完成所消耗的时间connect_time = curl_obj.getinfo(pycurl.CONNECT_TIME)#从发起请求到建立连接所消耗的时间redirect_time = curl_obj.getinfo(pycurl.REDIRECT_TIME)#从发起请求到重定向所消耗的时间ssl_time = curl_obj.getinfo(pycurl.APPCONNECT_TIME) #从发起请求到SSL建立握手时间pretrans_time = curl_obj.getinfo(pycurl.PRETRANSFER_TIME)#从发起请求到准备传输所消耗的时间starttrans_time = curl_obj.getinfo(pycurl.STARTTRANSFER_TIME) #从发起请求到接收第一个字节的时间print '发起请求到DNS解析时间 : %.3f ms' %(dns_time*1000)print '发起请求到TCP连接完成时间: %.3f ms' %(connect_time*1000)print '发起请求到跳转完成时间: %.3f ms' %(redirect_time*1000)print '发起请求到SSL建立完成时间 : %.3f ms' %(ssl_time*1000)print '发起请求到客户端发送请求时间: %.3f ms' %(pretrans_time*1000)print '发起请求到客户端接受首包时间: %.3f ms' %(starttrans_time*1000)print '总时间为: %.3f ms' %(total_time*1000)print ''transfer_time = total_time - starttrans_time#传输时间serverreq_time = starttrans_time - pretrans_time#服务器响应时间,包括网络传输时间if ssl_time == 0 : if redirect_time == 0 : clientper_time = pretrans_time - connect_time #客户端准备发送数据时间 redirect_time = 0 else : clientper_time = pretrans_time - redirect_time redirect_time = redirect_time - connect_time ssl_time = 0else : clientper_time = pretrans_time - ssl_time if redirect_time == 0 : ssl_time = ssl_time - connect_time redirect_time = 0 else : ssl_time = ssl_time - redirect_time redirect_time = redirect_time - connect_timeconnect_time = connect_time - dns_timeprint '发起请求到DNS解析时间 : %.3f ms' %(dns_time*1000)print 'TCP连接消耗时间 : %.3f ms' %(connect_time*1000)print '跳转消耗时间: %.3f ms' %(redirect_time*1000)print 'SSL握手消耗时间 : %.3f ms' %(ssl_time*1000)print '客户端发送请求准备时间: %.3f ms' %(clientper_time*1000)print '服务器处理时间: %.3f ms' %(serverreq_time*1000)print '数据传输时间: %.3f ms' %(transfer_time*1000)
经过多次测试,终于dns_time+connect_time+......+starttrans_time=total_time
1 0
- pycurl检测网站性能,pycurl.*_TIME时间问题
- PycURL
- pycurl
- pycurl问题
- pycurl+web服务质量检测
- 转pycurl安装问题
- pycurl安装问题
- 用pycurl监控http响应时间
- 获取http响应时间,pycurl,python
- Pycurl介绍
- curl pycurl
- pycurl 应用
- pycurl post
- pycurl 安装
- Pycurl学习
- pycurl WRITEFUNCTION
- pycurl字符编码方面的一些问题
- [原创] pycurl简单用法与urllib2性能对比
- 欢迎使用CSDN-markdown编辑器
- Android用户页面
- Linux[Centos7] yum安装mysql步骤
- sublime 常用快捷键
- Java中的private、protected、public和default的区别
- pycurl检测网站性能,pycurl.*_TIME时间问题
- Android Activity管理工具类
- ubuntu14.04下安装ffmpeg1.0.10
- hibernate依赖的jar包及用途
- Kibana基本使用
- 利用libqrencode生成二维码并保持成bmp图片
- Ubuntu创建新用户及新用户NFS挂载远程目录权限问题
- 文字上下滚动
- 在使用@NotBlank等注解时,一定要和@valid一起使用,不然@NotBlank不起作用