6-2 - 客户端超时

调用方在发送请求后,未能在指定时间内获得相应的响应,就会发生超时。

可能原因

  1. 服务器处理确实很慢,无法在指定时间内返回结果。调用方会自动返回超时异常响应,结束调用。
  2. 如果服务器响应很快,但当客户端负载高、负载压力大时,由于客户端请求未发送出去或响应卡在 TCP 缓冲区等问题,也会导致超时。因为客户端接收服务器发送的数据或向服务器请求数据时,会在系统级别排队。如果系统负载比较高,在内核态花费的时间会增加,导致客户端获取值时超时。
  3. 通常是业务处理太慢,可以在服务提供者机器上执行:jstack [PID] > jstack.log 分析线程卡在哪个方法调用上,这就是慢的原因。如果性能调优不可行,则增加超时阈值。

故障排除和解决步骤

  1. 双方可能都在进行 GC。检查服务器和客户端的 GC 日志。长时间的 GC 会导致超时。超时的发生可能意味着调用方或服务器的资源(CPU、内存或网络)存在瓶颈。需要检查问题是在服务器端还是调用方,排除 GC 抖动等嫌疑。
  2. 检查服务器的网络质量,例如重传率,排除网络嫌疑。
  3. 借助链路跟踪分析服务(如阿里的 ARMS、开源的 [OpenTracing](https://github.com/opentracing/) opentracing-java 系统实现 ZipkinSkyWalking 等)分析每个点的耗时情况。

致谢

此错误代码的常见问题解答页面参考了 “Dubbo 常见错误及解决方案”

引用的文章根据 CC-BY-4.0 许可证编译。在此感谢原作者。