http 连接池的那三个超时时间是怎么算的

2022-03-31 14:58:13 +08:00
 luxinfl

已经配置了获取连接时间 100 ,建立连接时间 20 ,读取数据时间 200 。但是大批量并发调用的时候,自己打印的 log 在超时的时候选超过 320ms 的时间,零散的 800+ms 。是连接数不够了麽? cpu 和内存的负载才一半。

1532 次点击
所在节点    程序员
10 条回复
seckill
2022-03-31 15:23:09 +08:00
第一,起始时间从哪里开始计算?
第二,连接池的数量和并发的数量各是多少?
luxinfl
2022-03-31 15:28:44 +08:00
@seckill 1.用的 resttemplate ,打印时间包在 postFor
Entity 外面 2.tmocat 默认配置 200 线程,defaultMaxPerRoute 是 150 。并发数量上万 qps 。
xiangyuecn
2022-03-31 15:37:08 +08:00
第 99ms 连接已建立

第 100ms 收到第 1 字节

第 299ms 收到第 2 字节

第 498ms 收到第 3 字节

...

发送端就是玩🐶 你应该明白 800+ms 怎么来的了吧,最后一个 timeout 是沙雕功能
luxinfl
2022-03-31 15:40:38 +08:00
@xiangyuecn 这是数据获取时间是用 readTimeout 控制的吧,会存在这种情况麽?
xiangyuecn
2022-03-31 15:44:42 +08:00
readTimeout 一般是距离上次获得数据后,再也没有收到数据的超时时间,这个时间并不是从建立连接开始计算。

但这种功能大部分情况下不是开发者想要的,大部分想要的超时配置,是从发起请求开始,超过多久还没有结束,就直接 cancel 掉,管你什么获取连接,建立连接,读取超时,可惜那伙人不直接给这种配置
luxinfl
2022-03-31 15:49:26 +08:00
@xiangyuecn 那我和第三方服务建立连接以后,读取数据的总耗时不就是 read timeout 时间控制的么。现在问题是完整的的连接耗时超过了配置的三个参数总和,而且超过很多。。。这说不通啊,难道是日志打印的问题?
chengyiqun
2022-03-31 15:50:00 +08:00
@xiangyuecn 同, 以前被这个困扰过, 后来不管了
xiangyuecn
2022-03-31 15:57:25 +08:00
@luxinfl #6 你想要的这种超时控制,一般没有直接的配置可以用的,得自己写定时器,所以我说这玩意沙雕的很😂

我的原话是:“readTimeout 一般是距离上次获得数据后,再也没有收到数据的超时时间,这个时间并不是从建立连接开始计算。”
luxinfl
2022-03-31 16:04:43 +08:00
@xiangyuecn 有相关代码可以参考一下么,大佬
FrankAdler
2022-03-31 20:42:53 +08:00
可以每个小环节都收集下时间看看,负载较高时计时器不准很正常吧,或者还有部分时间没有被你理解到,比如 dns 解析耗时,中间数据处理耗时等

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/844110

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX