WIN2012 TCP ECN 启用导致速度慢
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,测试偶尔访问指定网站速度慢的原因1 现象 某业务在客户服务器上,开发人员反映周期性速度慢,开发人员反馈,由于需要到xxx.com去取数据,慢的原因是取数据慢直接访问该站点下载文件发下下载速度很快2 测
千家信息网最后更新 2025年12月01日WIN2012 TCP ECN 启用导致速度慢
测试偶尔访问指定网站速度慢的原因
1 现象 某业务在客户服务器上,开发人员反映周期性速度慢,开发人员反馈,由于需要到xxx.com去取数据,慢的原因是取数据慢
直接访问该站点下载文件发下下载速度很快
2 测试脚本如下
3 测试结果发现 是每次第一次访问xxx.com的时候的 建立连接的时间很慢,需要9秒以上
4 最终原因 操作系统启用了TCP ECN,而目的地路由器未使用ECN 导致TCP握手时间延长
netsh interface tcp set global ecncapability=disabled 关闭后正常
5 没有介绍TCP ECN 只是介绍如何发现问题原因
#!/bin/env python# -*- coding: utf-8-*-#author: skybug#date: 2017-12-2#web_perf_testimport urllib2,sys,pycurl,json,StringIOimport os,subprocessimport platform,_winreg#ipvip = socket.gethostbyname ("www.xxx.com")#获取DNS解析值 本次未用reload(sys)sys.setdefaultencoding('utf-8')iplist = ["113.x.x.1","113.x.x.x","x.x.x.x","x.x.x.x","x.x.x.x"]#vipgate,vip,cnki,cnki2,chaoxingurllist=["http://x.com","http://a.com"]UA = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Mobile Safari/537.36"headers = {}def header_function(header_line): #获取响应头,本次未调用 header_line = header_line.decode('iso-8859-1') if ':' not in header_line: return name, value = header_line.split(':', 1) name = name.strip() value = value.strip() name = name.lower() headers[name] = valuedef webperf_keep(url,times=1): #获取访问页面的性能数据 b = StringIO.StringIO() #定义个IO流 pc=pycurl.Curl()#创建pycurl对象 cnt=0 alldata=[] for i in range(int(times)): pc.setopt(pycurl.URL,url) #设置访问url pc.setopt(pycurl.HTTPHEADER, ['Content-Type: application/json']) pc.setopt (pycurl.USERAGENT,UA)#设置UA pc.setopt(pycurl.MAXREDIRS,50) #MAX REDIRECT count#设置最大重定向次数 pc.setopt(pycurl.WRITEFUNCTION, b.write)#把相应内容写到流里 pc.setopt( pycurl.FOLLOWLOCATION,1)#跟踪重定向 pc.setopt(pycurl.FORBID_REUSE, 0)#允许复用连接 pc.setopt(pycurl.FRESH_CONNECT,0) pc.setopt (pycurl.HEADERFUNCTION, header_function)#把头信息写到头函数里 print "testing access {0} {1} times.....".format (url, cnt) pc.perform()#执行pycurl cnt+=1 dns_time = pc.getinfo(pycurl.NAMELOOKUP_TIME)#dns解析时间 conn_time = pc.getinfo(pycurl.CONNECT_TIME)#建立连接的时间(TCP握手) ttfb = pc.getinfo(pycurl.STARTTRANSFER_TIME)#TTFB的时间 total_time = pc.getinfo(pycurl.TOTAL_TIME)#总时间 http_code = pc.getinfo(pycurl.HTTP_CODE)#返回code http_conn_code= pc.getinfo(pycurl.HTTP_CONNECTCODE)# redirect_count = pc.getinfo(pycurl.REDIRECT_COUNT)#重定向次数 size_upload = pc.getinfo(pycurl.SIZE_UPLOAD) size_download = pc.getinfo(pycurl.SIZE_DOWNLOAD) size_header = pc.getinfo(pycurl.HEADER_SIZE) size_request = pc.getinfo(pycurl.REQUEST_SIZE) content_type = pc.getinfo(pycurl.CONTENT_TYPE) reponse_code = pc.getinfo(pycurl.RESPONSE_CODE) transfer_time = pc.getinfo(pycurl.PRETRANSFER_TIME) #传输时间 startrans_time= pc.getinfo(pycurl.STARTTRANSFER_TIME)#开始传输时间 speed_download = pc.getinfo(pycurl.SPEED_DOWNLOAD)#下载速度 speed_upload = pc.getinfo(pycurl.SPEED_UPLOAD)#上传速度 redirect_time = pc.getinfo(pycurl.REDIRECT_TIME)#重定向时间 num_conn = pc.getinfo(pycurl.NUM_CONNECTS)#建立连接的次数 last_socket= pc.getinfo(pycurl.LASTSOCKET)#最后一个socker data = [] perfdata={"dns_time":dns_time,"ttfb":ttfb,"total_time":total_time,"http_code":http_code,"redirect_count":redirect_count ,"size_upload":size_upload,"size_download":size_download,"size_header":size_header,"size_request":size_request ,"content_type":content_type,"reponse_code":reponse_code,"conn_time":conn_time,"transfer_time":transfer_time,"speed_download":speed_download ,"speed_upload":speed_upload,"startrans_time":startrans_time,"redirect_time":redirect_time,"http_conn_code":http_conn_code,"num_conn":num_conn,"last_socket":last_socket} data.append(url) data.append(perfdata) alldata.append(cnt) alldata.append(data) #pc.close() #b.close() jsondata=json.dumps({"perfdata":alldata},indent=4) pc.close() b.close() return jsondatadef getos():#获取操作系统版本 os = {} if sys.platform == "win32": try: reg_key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion") if reg_key: ProductName = _winreg.QueryValueEx(reg_key, "ProductName")[0] or None EditionId = _winreg.QueryValueEx(reg_key, "EditionId")[0] or None ReleaseId = _winreg.QueryValueEx(reg_key, "ReleaseId")[0] or None CurrentBuild = _winreg.QueryValueEx(reg_key, "CurrentBuild")[0] or None BuildLabEx = _winreg.QueryValueEx(reg_key, "BuildLabEx")[0][:9] or None os = {"ProductName": ProductName, "EditionId": EditionId, "ReleaseId": ReleaseId, "CurrentBuild": CurrentBuild, "BuildLabEx": BuildLabEx} jsondata = json.dumps({"OS": os}, indent=4) return jsondata except Exception as e: print e.message.decode(DEFAULT_LOCALE_ENCODING)def getcmd(shell):#执行cmd ps = subprocess.Popen(shell, shell=True, stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE) out, err = ps.communicate() return out.decode('cp936').encode('utf-8')def writelog(str): with open("result.txt",'a+') as fr: fr.write(str) fr.write("################################")if len(sys.argv) ==2 and sys.argv[1] == "full": cnt = 0 print "test setp {0},Collect routing information....".format(cnt) cmd="route print " writelog(getcmd(cmd))#获取路由表 print "test setp {0} ,Collect routing information....OK".format(cnt) cnt = cnt+1 print "test setp {0},Collecting network information....".format(cnt) cmd="ipconfig /all "#获取网卡配置 writelog(getcmd(cmd)) print "test setp {0},Collecting network information....OK".format(cnt) cnt = cnt+1 print "test setp{0},Collecting TCP information....".format(cnt) cmd = "netsh int tcp show global"#获取TCP全局配置 writelog(getcmd(cmd)) print "test setp{0},Collecting TCP information....OK".format(cnt) cnt=+1 print "test setp{0},Collecting OS information....".format(cnt) writelog(getos())#获取操作系统版本 print "test setp{0},Collecting OS information....OK".format(cnt) for index,item in enumerate(iplist): cmd="tracert "+item#获取路由跟踪 print "test setp {0},Collecting route tracking information....".format(cnt) writelog(getcmd(cmd)) print "test setp {0},Collecting route tracking information....OK".format(cnt) cnt=cnt+1 for index,item in enumerate(urllist): print "test setp {0},Collecting web to access information data....".format(cnt) writelog(webperf_keep(item)) print "test setp {0},Collecting web to access information data....OK".format(cnt) cnt=cnt+1 print "All test data collection is completed!"if len(sys.argv) ==3: url = sys.argv[1] times = sys.argv[2] print "pre test access {0} {1} times.....".format(url,times) writelog(webperf_keep(url,times))if len(sys.argv)==1: print "Please run web.perf.test full to full test \nor run web.perf.test 'http://www.xxx.com/' 10 ro run 10 times access test"
时间
速度
原因
操作系统
数据
次数
系统
路由
x.x.x.x
测试
人员
版本
传输
开发
跟踪
配置
最大
业务
信息
全局
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器设置两个网口聚合
新邦软件开发
灵寿节能软件开发服务技术规范
勘察测绘研究院软件开发
学校开发游戏服务器
泉州零工科技互联网有限公司
维普数据库查期刊
深圳排队网络技术
数据库技术物流
win10基础软件开发
网络技术推荐书单
借贷平台网络安全风险
婚庆租车软件开发
网络安全年
服务器不开机
福建软件开发设施有哪些
江苏银行软件开发岗待遇
网络安全绘画水墨画
正定菏勾网络技术有限公司
期货 内存数据库
浪子回头音译软件开发
关于网络安全技术部条幅
未转变者好玩的服务器推荐
h61主板最高支持服务器cpu
网关服务器和路由器有关系吗
武汉网络安全大学投资多少钱
网络安全年
上网行为管理器的服务器
阿里软件开发部门叫啥
青岛软件开发集体户口