问题:某业务系统在运行一段时间后,某个API一定概率偶现Connection reset现象。

问题定位:

首先想到的是要本地复现出这个问题,但一直复现不出来。

1、根据线上问题相关日志判断应该是有部分丢包情况。可能是系统参数的设置问题,如果在  net.ipv4.tcp_tw_recycle 、net.ipv4.tcp_timestamps 均设置为1的情况下,可能会因为timestamps时间戳校验导致部分丢包。
2、查询了线上配置,lvs、引擎集群的系统参数配置,均是net.ipv4.tcp_tw_recycle=0,net.ipv4.tcp_timestamps=1,不具备出现1描述问题的条件。
3、排查lvs、引擎服务器上和丢包有关日志。如网卡netdev backlog队列是否溢出,网卡Ring Buffer设置值,半连接队列溢出值等,tcp的log等,均无异常情况。
4、在开发测试环境模拟多个客户端(5)个同时压测,jmeter长/短连接、Timeout时间、HttpClient版本,也未复现该问题,将客户端的配置改成net.ipv4.tcp_tw_recycle=1,net.ipv4.tcp_timestamps=1,来压测,排查下是否是客户端系统参数引起的,看下是否能重现,也未重现该问题。
5、通过httpclient编写api定时访问接口,短链接下未复现。
6、通过httpclient编写api访问接口,使用httpclient连接池,长连接下复现,每次任务sleep 随机0-60s。(考虑服务端keepalive_timeout时间是60s)。发现出现同样问题。判断是长连接情况下导致。
7、研究了下http连接池的长连接原理,默认策略如下。设置的客户端默认超时时间为-1,即永远不失效,重写该方法,设置时间为20s。发现不会出现该问题。

8、但考虑服务端有设置60s的超时时间,不会出现那么大概率的问题

9、可以通过在返回header头中加入timeout时间,强制给客户端设置一个长连接超时时间。如

10、去掉默认策略。(因为特殊原因不能让客户端改)仍然不能解决问题。

11、修改测试任务发送的时间,发现sleep时间在30S内不会出现该问题,sleep时间在30-60s会50%概率出现。

12、查询所有链路上的(客户端、lvs、nginx)的相关系统参数超时配置,修改均无效。

13、在设置为32S sleep的场景抓包分析。客户端抓包如下,发现在32S用同一个连接去发送数据后,服务端返回了一个RST(重置连接)信号。但对比服务端nginx日志,并未发现收到该包。怀疑问题出现在LVS

14、LVS上抓包,发现是LVS上回复了RST重置连接的包。检查LVS配置

15、发现有个如下设置:

ipvsadm --set 30 6 60

看说明,应该不会影响功能。在抓包的结果中也发现,客户端会重新换个连接,重新发一次请求。

16、思考良久,在测试代码中加入了catch,发现catch后就不会进行重新选取连接重试。导致BUG。

17、查看LVS官方文档,发现三个参数和baidu搜出来的结果不一致。该参数会使TCP连接超时。

18、修改参数为set 60 6 60,(加上参数的目的是为了缓解长连接 的四层tcp耗尽攻击)。问题解决。

至此,问题定位完成。要保证lvs的tcp established超时时间大于nginx的keepalive超时时间。

参考:http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.ipvsadm.html

https://dongliboyqq.iteye.com/blog/2409122

https://blog.csdn.net/qq_35440040/article/details/83543954

记一次httpclient Connection reset问题定位的更多相关文章

  1. 记一次压测问题定位:connection reset by peer,TCP三次握手后服务端发送RST_网络_c359719435的专栏-CSDN博客 https://blog.csdn.net/c359719435/article/details/80300433

    记一次压测问题定位:connection reset by peer,TCP三次握手后服务端发送RST_网络_c359719435的专栏-CSDN博客 https://blog.csdn.net/c3 ...

  2. HttpClient : java.net.SocketException: Connection reset

    1. 问题排查 httpclient : 4.5.5 排查过程 : 一次SocketException:Connection reset 异常排查 主要原因 : 调用 http 请求时发生了 Sock ...

  3. HttpClient遭遇Connection Reset异常,如何正确配置?

    最近工作中使用的HttpClient工具遇到的Connection Reset异常.在客户端和服务端配置不对的时候容易出现问题,下面就是记录一下如何解决这个问题的过程. 出现Connection Re ...

  4. Java socket 说明 以及web 出现java.net.SocketException:(Connection reset或者Connectreset by peer:Socket write error)的解释

    另外http://www.cnblogs.com/fengmk2/archive/2007/01/15/using-Socket.html可供参考   一Java socket 说明 所谓socket ...

  5. JDBC Connection Reset问题分析

    2014年7月13日 半年前開始.项目组測试MM在验证功能时.常常报怨讲測试环境上的应用在启动时非常慢,偶尔会报失败,遇到类似问题多数情况下又一次启动一次就能够启动成功,但少数时候也有重复启动不成功的 ...

  6. 一次SocketException:Connection reset 异常排查

    问题描述 上一期的需求上线之后,线上多了一个异常:Connection reset.如下: [2017-03-22 00:45:00 ERROR] [creativeAuditTaskSchedule ...

  7. connection reset 分析解决(转载)

    文章转自:https://my.oschina.net/xionghui/blog/508758;记录下来以便以后复习查阅; 在使用HttpClient调用后台resetful服务时,“Connect ...

  8. Connection reset原因分析和解决方案

    在使用HttpClient调用后台resetful服务时,“Connection reset”是一个比较常见的问题,有同学跟我私信说被这个问题困扰很久了,今天就来分析下,希望能帮到大家.例如我们线上的 ...

  9. 令人头疼的Connection Reset

    背景: 要爬取某网站的数据,数据每页10条,有很多页(形式如同table表格).使用HttpClient 逐行逐页爬取数据,但在循环爬取多次时,总会在不确定的位置报错 在检查代码逻辑无果之后,开始疯狂 ...

随机推荐

  1. 【BZOJ4176】Lucas的数论-杜教筛

    求$$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}f(ij)$$,其中$f(x)$表示$x$的约数个数,$0\leq n\leq 10^9$,答案膜$10^9+ ...

  2. java几种远程服务调用协议的比较

    原文地址:http://www.cnblogs.com/jifeng/archive/2011/07/20/2111183.html 一.综述 本文比较了RMI,Hessian,Burlap,Http ...

  3. 记录python之递归函数

    函数move(n,a,b,c)的定义是将n个圆盘从a借助b移动到c. def move(n,a,b,c): if n==1: print a,'-->',c move (n-1,a,c,b) p ...

  4. asp.net C# 获取网页源代码的几种方式

    1 方法 System.Net.WebClient aWebClient = new System.Net.WebClient(); aWebClient.Encoding = System.Text ...

  5. Redit集群搭建-Sentinel模式搭建

    Redit集群搭建 学习了: Windows:http://blog.csdn.net/mrxiagc/article/details/52799081 Linux:https://www.cnblo ...

  6. 数据结构之---C语言实现拓扑排序AOV图

    //有向图的拓扑排序 //杨鑫 #include <stdio.h> #include <stdlib.h> #include <string.h> #define ...

  7. httpd: Could not reliably determine the server&#39;s fully qualified domain name

    [root@luozhonghua sbin]# service httpd start Starting httpd: httpd: apr_sockaddr_info_get() failed f ...

  8. 怎么样才算是精通 C++?

    C++是一门非常奇妙的语言.让人又爱又恨. 在知乎上看到的一个帖子.怎么样才算是精通C++,这里节选一些精彩的回复. 链接:http://www.zhihu.com/question/20201972 ...

  9. java关键字之transient

    转自:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizabl ...

  10. windows电脑空间清理

    最近电脑空间又快满了,想下载一些好电影音频资源都要先临时清理一些文件才行,今天有时间就彻底整理一下,将整理过程及用到的好工具都记录一下,方面下次再遇到问题时可以很方面的参考执行. 1.分析磁盘空间占用 ...