问题追查: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 进阶篇 ...
随机推荐
- ASP.NET Core 进程外(out-of-process)托管
ASP.NET Core 进程外(out-of-process)托管 在本节中,我们将讨论 ASP.NET Core 中的Out Of Process Hosting. ASP.NET Core 进程 ...
- UWP使用Microsoft.Data.Sqlite的记录
我在UWP中使用SQLite数据库时,并没有使用网上的SQLite for Universal App Platform方案,而使用了Microsoft和SQLite社区一起维护的Microsoft. ...
- Delphi - DateTimePicker控件日期格式
设置成显示年.月.日.时.分.秒 1:将DateTimePicker的Format属性中加入日期格式设成 'yyyy-MM-dd HH:mm:ss',注意日期里月份对应的MM是大写,时间里的分钟对应的 ...
- WPF控件模板(6)
什么是ControlTemplate? ControlTemplate(控件模板)不仅是用于来定义控件的外观.样式, 还可通过控件模板的触发器(ControlTemplate.Triggers)修改控 ...
- 最简单取得外网IP
#coding=utf-8import urllib2import re print re.search('\d+\.\d+\.\d+\.\d+',urllib2.urlopen("http ...
- 高强度学习训练第一天总结:Java内存区域
---恢复内容开始--- 程序计数器: 程序计数器(Program Counter Register) 是一块较小的空间,他可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念 ...
- Mybatis插入实体类字段为关键字解决方案
1. Mybatis插入实体类字段为关键字解决方案 1.1. 前言 可能你插入字段为关键字时报如下错误,且字段名不适合改变 You have an error in your SQL syntax; ...
- 英语LIGNALOO沉香lignaloo单词
沉香lignaloo,是瑞香科.沉香属的一种乔木,高5-15米.树皮暗灰色,几平滑,纤维坚韧:小枝圆柱形,具绉纹,幼时被疏柔毛,后逐渐脱落,无毛或近无毛.产于中国广东.海南.广西.福建等地.喜生于低海 ...
- Leetcode 88:合并两个有序数组
Leetcode链接 : https://leetcode-cn.com/problems/merge-sorted-array/ 问题描述: 给定两个有序整数数组 nums1 和 nums2,将 n ...
- MySql学习笔记三
MySql学习笔记三 4.DML(数据操作语言) 插入:insert 修改:update 删除:delete 4.1.插入语句 语法: insert into 表名 (列名1,列名2,...) val ...