本文介绍如何排查和解决程序连接Nacos出现的超时问题。
问题现象
当程序连接Nacos出现超时问题时,可能出现如下几种报错:
Connection timed out
Read Timeout
TimeoutException: Waited 3000 milliseconds
问题原因
可能是以下几种原因,导致程序连接Nacos出现超时问题。
(1) 客户端与服务端的网络传输异常,导致客户端发出的请求无法抵达服务端或服务端的回复无法抵达客户端。或者服务端处理请求速度慢,导致客户端误认为超时。
(2) 使用VPN导致的网络问题。
(3) 客户端的处理线程阻塞或异常,亦或客户端处于Full GC、OOM或CPU争抢等状态, 无法及时处理服务端返回的数据包,导致客户端误认为超时。
(4) Nacos集群处于异常状态,无法响应请求
解决方案
(1) 如果仅有某一个客户端节点出现超时报错,可能是这些客户端节点与Nacos之间的网络出现问题,或是这些客户端节点存在异常或阻塞。
此时,您可在错误所在的客户端节点上,使用ping、telnet和curl等命令,访问Nacos集群。查看客户端监控是否存在高CPU使用率、频繁FullGC和OOM等信息,以此排查是否存在网络问题。
ping ${mse.nacos.host}
telnet ${mse.nacos.host}:47588
curl ${mse.nacos.host}:47588/nacos/v1/ns/service/list
(2) 如果使用了VPN,请关闭VPN或查看VPN设置后重试。
(3) 如错误信息存在于所有的客户端节点,可以在监控分析页面查看Nacos实例的监控信息:
在概览页签,查看引擎的每秒查询数和每秒操作数是否超过了每秒处理请求数(TPS)。
关于每秒处理数的取值,请参见实例能力评估。
在连接数监控页签,查看客户端版本数量和长链路数量是否超过了连接数。
关于连接数的取值,请参见实例能力评估。
在jvm监控页签,查看引擎Full GC是否频繁出现。
当通过ELB访问Nacos时,查看资源的入口流量和出口流量是否超出购买时指定的带宽大小。
在系统资源监控tab页查看资源的内存使用率和CPU使用率是否接近或超过100%,导致实例出现异常。
(4) 如果仅是偶尔发生超时错误,考虑设置更长的超时时间避免此类问题。
若Java Client版本为1.0.0~1.4.X,则建议升级客户端版本到2.x系列版本。
若Java Client版本为2.0.0~2.1.1, 请将Java Client版本先升级至2.1.2及以上,再设置超时时间。
若Java Client版本为2.1.2及以上,请在应用进程的JVM参数中添加如下参数:
-Dnacos.remote.client.grpc.timeout=${请求超时,单位毫秒,默认3000}## 检测所连接的服务端是否健康,不健康则触发重连
-Dnacos.remote.client.grpc.server.check.timeout=${服务端健康检测,单位毫秒,默认3000}## 检测当前连接状态是否健康,不健康则触发重连
-Dnacos.remote.client.grpc.health.timeout=${连接健康检测,单位毫秒,默认3000}