A 服务调用 B 服务超时,如何排查?

2023-10-18 14:08:25 +08:00
 hangbo

后端服务: 内部服务 A 通过域名的方式调用内部服务 B, A 服务设置了 300ms 的超时时间, 部分请求在到达 B 服务时就已经超时, 也就是在 B 服务入口处打印了日志,发现进入的时间已经超过 300ms 了, A 调用 B 超时.

目前我自己试过:

  1. 怀疑是网络问题, 在服务 A 中 ping 服务 B 的域名, 发现无问题
  2. 排查 A,B 服务的 GC 日志也没问题, 也没其他报错

上述都没发现什么问题,请问大佬们还能从哪些方面入手排查?

1525 次点击
所在节点    程序员
12 条回复
zz44917
2023-10-18 14:25:05 +08:00
A 、B 两端同时抓包,看网络报文时间。
maninnet
2023-10-18 15:00:43 +08:00
有没有可能 dns 缓存过期?
Goooooos
2023-10-18 15:03:00 +08:00
也有可能消息已经到 B 了,但由于 B 线程池堵塞,等处理消息后才打的日志
xuhai951753
2023-10-18 15:07:18 +08:00
这个只能是网关耗时太长了吧。。如果使用了网关的话。。
hangbo
2023-10-18 15:48:05 +08:00
@zz44917 好的,我试试
zpfhbyx
2023-10-18 16:45:44 +08:00
链路追踪..
8355
2023-10-18 16:56:31 +08:00
公网域名/ 跨服务区等各种问题 应该很好解决 不会就提工单咯
sujin190
2023-10-18 17:06:25 +08:00
k8s 的话也许是 dns 解析问题
treexie
2023-10-19 08:54:03 +08:00
将连接的每个阶段的耗时均记录起来即可,例如 http 调用的就包括以下步骤。golang 的可以参考: https://github.com/davecheney/httpstat ,其它语言的也类似。

DNS Lookup TCP Connection TLS Handshake Server Processing Content Transfer
[ 0ms | 0ms | 241ms | 26ms | 0ms ]
| | | | |
namelookup:0ms | | | |
connect:0ms | | |
pretransfer:242ms | |
starttransfer:269ms |
total:269ms
isno
2023-10-19 09:25:45 +08:00
garychenlin
2023-10-19 09:54:27 +08:00
遇到过相同的问题,当时原因是程序内有 dns 解析的缓存 ip ,程序访问域名的时候,会从这些缓存的 ip 一个一个尝试连接。
这种情况下,能 ping 通并不代表没有问题。

当时处理方案:
1. 两端抓包,统计请求包发出和收到时间
2. 定位到耗时在请求包发出之前,于是细化耗时区间,通过日志或者其他方式,记录请求包发出过程的时间,比如打包、压缩、加密、dns 解析等
3. 然后就定位到了 dns
feitxue
2023-10-19 13:47:20 +08:00
服务 A 和 B 是否在同一个内网?
都是内部服务,那么域名解析的 ip 是公网 ip 还是内网 ip

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

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

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

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

© 2021 V2EX