记录一个HttpClient超时连接配置不生效的问题排查过程
现象
首先有一个被服务由于内存有限,导致巨卡。导致调用他的服务出现线程阻塞。jstack打印线程池如下所示:
开始排查解决问题
第一步:检查代码看是否超时设置是否正确,因为感觉超时设置正确不可能阻塞。
找到注入client的位置:
发现配置没有任何问题,此时感到了一点点慌张。(内心OS: 难不成HttpClient还有BUG, 讲道理这么成熟的框架不应该啊)
第二步:本着高效的原则,百度一下是否有其他人踩过这样的坑了。
咦,这不和遇到的一样吗? 心想搞定。看我jstack栈阻塞堆栈信息,也是有重试的信息,如下图所示:
那么直接更改我们的client注入代码为如下:
以为到这里故事就结束了,开开心心重新部署一下,就去玩其他的了。
噩梦再次上演:几天后,被调用服务再次出现卡顿,然后调用方又阻塞了,what fuck !
老规矩看堆栈信息:
还是熟悉的配方,一样的错误,阻塞在同一个地方。本着高效的原则,GPT了一下,然并没有什么用,都是一些太泛的思路,这玩意干精细活还是有缺陷:
那这样的话,就苦逼了,只能慢慢的撸他源码了。因为服务器卡顿是偶现,还没法调试。找到构建过程如下:
显然实际执行在InternalHttpClient里面。点进去看一下他的执行过程:
发现我们配置的requestConfig可能并未生效,他可能直接从Request里面取,那这显然有可能在调用方给Request手动配置requestConfig。 找到调用处的代码:
显然确实有可能是这个原因,那有了上次的经验,我们要验证一下。由于服务器卡顿是偶现,我们debug看一下是不是走到这里了:
发现都是-1, 那应该就是这个问题了,Request配置,重新打包部署,问题再也没有复现过。over!
题外话
源码定位问题的过程省略了很多,所以看起来解决问题过程似乎很简单。因为框架代码毕竟那么多,我第一步先是猜想要先定位到他超时判断逻辑的代码在哪里,才能知道为什么不生效。定位了很久才发现框架本身并无相关逻辑,他是构建了一个Socket去请求,在socket中有两个时间,一个是soTimeOut(读流超时时间), 一个是connectTimeOut(连接超时时间)。 其在创建socket的时候需要指定connectTimeOut,然后soTimeOut可在发起请求前设置。 当然这也反应出分析问题不够冷静, 忽略了基本的网络常识,这些成熟的框架,一开始就应该思考是不是配置不正确的问题,究其原因也是对框架不够深入了解,不知道具体的某个请求可能还存在可以配置单独的RequestConfig对象,一味的关注CloseableHttpClient的配置去了。
记录一个HttpClient超时连接配置不生效的问题排查过程的更多相关文章
- 【Redis连接超时】记录线上RedisConnectionFailureException异常排查过程
项目架构: 部分组件如下: SpringCloudAlibaba(Nacos+Gateway+OpenFeign)+SpringBoot2.x+Redis 问题背景: 最近由于用户量增大,在高峰时期, ...
- HttpClient设置连接超时时间
https://www.cnblogs.com/winner-0715/p/7087591.html 使用HttpClient,一般都需要设置连接超时时间和获取数据超时时间.这两个参数很重要,目的是为 ...
- 记录一次php连接mssql的配置
记录一次php连接mssql的配置 在现有php环境中,php连接mssql数据库失败,tsql 连接正常. 确认问题在php环境上. 网上有个同仁总结的很好,https://blog.csdn.ne ...
- 踩坑记录:Redis的lettuce连接池不生效
踩坑记录:Redis的lettuce连接池不生效 一.lettuce客户端 lettuce客户端 Lettuce 和 Jedis 的都是连接Redis Server的客户端程序.Jedis在实现上是直 ...
- [转] python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054
python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接.问题解决方案: 前几天使用python读取网页.因为对一个网站大量的使用urlopen操作,所以 ...
- windows Redis绑定ip无效,Redis设置密码无效,Windows Redis 配置不生效, Windows Redis requirepass不生效
windows Redis绑定ip无效,Redis设置密码无效,Windows Redis 配置不生效, Windows Redis requirepass不生效 >>>>&g ...
- httpClient 超时时间设置(转)
尊重博主原创,特贴博客链接.copy下来只怕以后链接失效或删掉. 转自:http://blog.csdn.net/hi_kevin/article/details/32316171 HttpClien ...
- hystrix ,feign,ribbon的超时时间配置,以及原理分析
背景,网上看到很多关于hystrix的配置都是没生效的,如: 一.先看测试环境搭建: order 服务通过feign 的方式调用了product 服务的getProductInfo 接口 //---- ...
- Tomcat连接配置
DBCP连接池配置: <bean class="org.apache.tomcat.jdbc.pool.PoolProperties"> <property na ...
- Nginx与Tomcat、Client之间请求的长连接配置不一致问题解决[转]
http://bert82503.iteye.com/blog/2152613 前些天,线上出现“服务端长连接与客户端短连接引起Nginx的Writing.Active连接数过高问题”,这个是由于“服 ...
随机推荐
- 记录--千万别让 console.log 上生产!用 Performance 和 Memory 告诉你为什么
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 很多前端都喜欢用 console.log 调试,先不谈调试效率怎么样,首先 console.log 有个致命的问题:会导致内存泄漏. 为什 ...
- Java AES CBC模式 加密和解密
import org.apache.tomcat.util.codec.binary.Base64; import javax.crypto.Cipher; import javax.crypto.s ...
- 英语文档之vivado界面
vivado英文界面 一.界面内容 图中就是vivado常用的界面. 二.常用窗口 首先是左侧的project manager:IP INTEGRATOR(IP 集成器),simulation(仿真) ...
- KingbaseES V8R6运维案例之---wal日志解析DDL操作
案例说明: 通过sys_waldump解析DDL操作,获取DDL操作的日志条目具体内容. 适用版本: KingbaseES V8R3/R6 一.DDL事务操作对应的wal日志文件 # 查看当前on ...
- virtualbox安装windows10出现OOBE,卡在OOBE。
参照 https://zhuanlan.zhihu.com/p/419237209 https://www.0z.gs/win/781.html 文档 https://learn.microsoft. ...
- oracle建表语句,添加主键、索引、注释,插入数据,添加序列
create table FND_COMPANIES_42624( COMPANY_ID number(3) primary key, -- 公司ID number 序列 COMPANY_CODE V ...
- MySQL 数据库操作指南:LIMIT,OFFSET 和 JOIN 的使用
限制结果 您可以通过使用"LIMIT"语句来限制查询返回的记录数量.以下是一个示例,获取您自己的Python服务器中"customers"表中的前5条记录: i ...
- C#实现文件加密、解密及文件拖拽至程序图标直接打开
引用:https://www.cnblogs.com/longqi293/archive/2010/07/23/1783672.html 下载源码:http://files.cnblogs.com/l ...
- 进阶 stack smashing--canary 报错利用 && environ泄露栈地址
进阶 stack smashing--canary 报错利用 && environ泄露栈地址 这部分是对进阶stack smashing的使用,以及对 environ的认识,我们可以看 ...
- redis 简单整理——缓存设计[三十二]
前言 简单整理一下缓存设计. 正文 缓存的好处: ·加速读写:因为缓存通常都是全内存的(例如Redis.Memcache),而 存储层通常读写性能不够强悍(例如MySQL),通过缓存的使用可以有效 地 ...