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情况的更多相关文章

  1. [软件测试]网站压测工具Webbench源码分析

    一.我与webbench二三事 Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能.Webbench ...

  2. 压测工具使用(vegeta)

    一.压测工具vegeta 1.介绍 Vegeta 是一个用 Go 语言编写的多功能的 HTTP 负载测试工具,它提供了命令行工具和一个开发库. 官方地址:https://github.com/tsen ...

  3. 网站(Web)压测工具Webbench源码分析

    一.我与webbench二三事 Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能.Webbench ...

  4. web服务器压测工具siege、ab

    web服务器压测工具也挺多,这里只介绍我用过的这两种--siege(for linux).ab(for windows). 一.siege 1.简介: Siege是一款开源的压力测试工具,设计用于评估 ...

  5. 压测工具siege和wrk

    siege压测工具 安装: wget http://download.joedog.org/siege/siege-3.0.8.tar.gz cd siege-3.0.8 ./configure ma ...

  6. SuperBenchmarker一个用.NET编写的压测工具

    0x01 前言 在这之前想必大家对ab(http)与abs(https)也有一些了解,我们今天不去看ab和abs,SuperBenchmarker(sb.exe)是一个压测工具,他是一个受Apache ...

  7. 1. 堪比JMeter的.Net压测工具 - Crank 入门篇

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

  8. 3. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识bombardier

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

  9. 4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

随机推荐

  1. C# 人民币大写金额转换

    /// <summary>       /// 转换人民币大小金额       /// </summary>       /// <param name="nu ...

  2. Git以及GitHub的一些基本使用

    1:注册GitHub账号: https://github.com/ 2:Git bash工具下载地址 https://gitforwindows.org/ 3:怎么在GitHub 新增 SSH Key ...

  3. pymysql 的简单使用

    一.环境 Windows  7 x64     python 3.7.1    pymysql 0.9.3  mysql5.6.43 二.pymysql的简单使用 1.准备数据库demo_temp c ...

  4. HTTPS免费证书

    HTTPS 证书 一: 利用 cerbot 本地服务器 申请免费可用的证书.缺点就是三个月需要手动换一次 官网: https://certbot.eff.org/lets-encrypt/ubuntu ...

  5. JavaScript BOM Cookie 的用法

    JavaScript Cookie Cookie是计算机上存储在小文本文件中的数据.当Web服务器将网页发送到浏览器时,连接将关闭,服务器将忘记用户的所有内容.发明Cookie是为了解决“如何记住用户 ...

  6. webpack4 css modules

    demo 代码点此,webpack4 中通过 css-loader 开启 css 模块化, 开始前先做点准备工作. 不了解 css 模块化的,可以前往查看github_css_modules. ##准 ...

  7. java Random类生成随机数

    封装一个方法: import java.util.Random; public class RandomUtil { /** * nextInt(num) 产生[0 ~ (num-1)]的随机数, 闭 ...

  8. STM32芯片命名规则

  9. SQL之单表与多表查询

    DML语句使用 source  路径  :把SQL脚本导入到数据库中 查询语句类型:[简单查询|多表查询|子查询] 投影:select    字段名,字段名   from   表名   where   ...

  10. Logback文件这么配置,TPS提高至少10倍

    来源:https://tinyurl.com/y5zbtgsq 阅读本文,你将了解到 日志输出到文件并根据LEVEL级别将日志分类保存到不同文件 通过异步输出日志减少磁盘IO提高性能 异步输出日志的原 ...