问题追查:QA压测工具http长连接总是被服务端close情况
1. 背景
最近QA对线上单模块进行压测(非全链路压测),http客户端 与 thrift服务端的tcp链接总在一段时间被close。
查看服务端日志显示 i/o timeout.
最后的结果是: qps太小, 长时间不发送请求, server主动关闭socket
2. 查看thrift框架原代码
thrift框架处理请求伪代码如下:
//服务端listen
for {
	// 服务端接收一个tcp连接请求
	client := server.accept()
	// 独立启动一个goroutine处理client后续请求
	go fun () {
		inputTrans := xxx(client)
		outputTrans := xxx(client)
		if inputTrans != nil {	//return 时, 关闭读
			defer 	inputTrans.close()
		}
		if outputTrans != nil {
			defer 	outputTrans.close()	//return时, 关闭写
		}
		//独立goroutine处理写结果 (使用channel同步)
		go func(
			for {
				//超时,或者其他错误, return
			}
		) ()
		//for循环: 服务读取请求 (两个for循环使用channel同步)
		for {
			//超时,或者其他错误, return
		}
	}()
}
可以看出,
- thrift框架并没有使用像epollo那样的io多路复用,而是为每个client单独启一个goroutine进行处理
 - tcp时双通道, 上面代码中读、写分别处理,使用channel进行同步
 - 遇到client 超时或者错误,server会主动关闭tcp连接 (使用SetDeadline,SetReadDeadline,SetWriteDeadline设置超时时间)
 
3. 可能的两种超时情况
3.1 server写超时
压测工具,只负责发送请求,一般不读取请求。
如果使用socket直接连服务器thrift端口,只send数据,不recv数据。可能使得server发送缓冲区满,发送数据超时。
3.2 server 读超时
client qps太小,发送请求时间间隔大于server设置的读超时时间。
4. 总结
这里不是长连接、短连接的问题,是server服务器端的一种自我保护机制。
服务器用于接收大量的client请求,如果存在大量的无用连接不仅会占用服务器资源,更严重的情况会使得其他client无法连接服务器的情况。
可以使用其他方法解决:
- client和server自定义心跳协议。如secret的发送no-op命令
 - 比如redis client, 如果连接断开可以进行重发一次(先连接,再发)
 
问题追查:QA压测工具http长连接总是被服务端close情况的更多相关文章
- [软件测试]网站压测工具Webbench源码分析
		
一.我与webbench二三事 Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能.Webbench ...
 - 压测工具使用(vegeta)
		
一.压测工具vegeta 1.介绍 Vegeta 是一个用 Go 语言编写的多功能的 HTTP 负载测试工具,它提供了命令行工具和一个开发库. 官方地址:https://github.com/tsen ...
 - 网站(Web)压测工具Webbench源码分析
		
一.我与webbench二三事 Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能.Webbench ...
 - web服务器压测工具siege、ab
		
web服务器压测工具也挺多,这里只介绍我用过的这两种--siege(for linux).ab(for windows). 一.siege 1.简介: Siege是一款开源的压力测试工具,设计用于评估 ...
 - 压测工具siege和wrk
		
siege压测工具 安装: wget http://download.joedog.org/siege/siege-3.0.8.tar.gz cd siege-3.0.8 ./configure ma ...
 - SuperBenchmarker一个用.NET编写的压测工具
		
0x01 前言 在这之前想必大家对ab(http)与abs(https)也有一些了解,我们今天不去看ab和abs,SuperBenchmarker(sb.exe)是一个压测工具,他是一个受Apache ...
 - 1. 堪比JMeter的.Net压测工具 - Crank 入门篇
		
目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...
 - 3. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识bombardier
		
目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...
 - 4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2
		
目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...
 
随机推荐
- 百度编辑器上传视频报Http请求错误,.net实现方式
			
在使用百度编辑器上传视频的时候遇到一个很奇怪的问题,当视频大小在20M以下的时候,上传正常.当大于20M时,一直报Http请求错误. 处理步骤: 1.修改编辑器配置信息,如图所示,改成你想要的大小 2 ...
 - C# - VS2019 WinFrm程序调用ZXing.NET实现条码、二维码和带有Logo的二维码的识别
			
前言 C# WinFrm程序调用ZXing.NET实现条码.二维码和带有Logo的二维码的识别. ZXing.NET导入 GitHub开源库 ZXing.NET开源库githib下载地址:https: ...
 - 洛谷 p1541乌龟棋
			
洛谷 p1541乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是终点,游戏 ...
 - 操作系统原理之I/O设备管理(第六章上半部分)
			
一.I/O系统的组成 I/O系统不仅包括各种I/O设备,还包括与设备相连的设备控制器,有些系统还配备了专⻔⽤ 于输⼊/输出控制的专⽤计算机,即通道.此外,I/O系统要通过总线与CPU.内存相连. I/ ...
 - Vue 动态修改data 值 并触发视图更新
			
Vue 动态修改data 值 并触发视图更新 this.$set(obj, key, '') // Vue 动态修改或者添加data key 并触发视图更新
 - Linux服务器用postfix 发送邮件延迟 阻塞 被接收方拒绝等问题
			
Linux服务器用postfix 发送邮件延迟 阻塞 被接收方拒绝等问题 postfix如何设置发送邮件延迟通知 1 */1 * * * /bin/bash /home/delete_postfix. ...
 - animations与transition
			
transition过渡 和animation 动画 要知道 transition过渡和animation动画都是实现元素运动的一种方式.区别在于: transition过渡需要人为触发,例如点击触发 ...
 - Qt 之 qwt 和 qwtpolar 的编译配置
			
1 Qwt Qwt 全称为 Qt Widgets for Technical Applications,用于专业技术领域的可视化显示,如下所示: 左图为二阶系统的频率响应:中图为德国小城 Fried ...
 - Scala比较器---Ordered与Ordering
			
1.Ordered 和 Ordering Scala提供两个特质(trait)Ordered与Ordering用于比较.其中,Ordered混入(mix)Java的Comparable接口,而Orde ...
 - 07webpack--下载对应的css模块
			
<!--本节 loader配置处理css样式 在src下新建css文件夹 在css下创建index.css 在main.js这个入口文件中 引入js模块 和 css杨思表是不同的 在main.j ...