6-2 - 客户端超时
调用方在发送请求后,未能在指定时间内获得相应的响应,就会发生超时。
可能原因
- 服务器处理确实很慢,无法在指定时间内返回结果。调用方会自动返回超时异常响应,结束调用。
- 如果服务器响应很快,但当客户端负载高、负载压力大时,由于客户端请求未发送出去或响应卡在 TCP 缓冲区等问题,也会导致超时。因为客户端接收服务器发送的数据或向服务器请求数据时,会在系统级别排队。如果系统负载比较高,在内核态花费的时间会增加,导致客户端获取值时超时。
- 通常是业务处理太慢,可以在服务提供者机器上执行:
jstack [PID] > jstack.log
分析线程卡在哪个方法调用上,这就是慢的原因。如果性能调优不可行,则增加超时阈值。
故障排除和解决步骤
- 双方可能都在进行 GC。检查服务器和客户端的 GC 日志。长时间的 GC 会导致超时。超时的发生可能意味着调用方或服务器的资源(CPU、内存或网络)存在瓶颈。需要检查问题是在服务器端还是调用方,排除 GC 抖动等嫌疑。
- 检查服务器的网络质量,例如重传率,排除网络嫌疑。
- 借助链路跟踪分析服务(如阿里的 ARMS、开源的 [OpenTracing](https://github.com/opentracing/) opentracing-java 系统实现 Zipkin、SkyWalking 等)分析每个点的耗时情况。
致谢
此错误代码的常见问题解答页面参考了 “Dubbo 常见错误及解决方案”。
引用的文章根据 CC-BY-4.0 许可证编译。在此感谢原作者。
上次修改时间:2023 年 1 月 3 日:合并错误代码 3-3 到 3-8,6-4 到 99-0。(#1796)(a687d30ae03)