6-2 - 客户端超时
超时是调用端发生在请求发出后,无法在指定的时间内获得对应的响应。
可能的原因
- 服务端确实处理比较慢,无法在指定的时间返回结果,调用端就自动返回一个超时的异常响应来结束此次调用。
- 服务端如果响应的比较快,但当客户端 Load 很高,负载压力很大的时候,会因为客户端请求发不出去、响应卡在 TCP Buffer 等问题,造成超时。因为客户端接收到服务端发来的数据或者请求服务端的数据,都会在系统层面排队,如果系统负载比较高,在内核态的时间占比就会加长,从而造成客户端获取到值时已经超时。
- 通常是业务处理太慢,可在服务提供方机器上执行:
jstack [PID] > jstack.log
分析线程都卡在哪个方法调用上,这里就是慢的原因。如果不能调优性能,请调高 timeout 阈值。
排查和解决步骤
- 两边可能有 GC,检查服务端和客户端 GC 日志,耗时很长的 GC,会导致超时。超时的发生很可能意味着调用端或者服务端的资源(CPU,内存或者网络)出现了瓶颈,需要检查服务端的问题还是调用端的问题来排除 GC 抖动等嫌疑。
- 检查服务端的网络质量,比如重传率来排除网络嫌疑。
- 借助链路跟踪的分析服务(比如阿里的 ARMS ,开源的 OpenTracing 系的实现 Zipkin 、SkyWalking 等)来分析下各个点的耗时情况。
致谢
这个错误码的 FAQ 页面参考了空冥同学的 《Dubbo 常见错误及解决方法》 。
所引文章通过 CC-BY-4.0 协议赋予了汇编的权利。在此向原作者表示感谢。
最后修改 December 16, 2022: Fix check (#1736) (97972c1)