26-异常-RedisTimeoutException
更多内容欢迎关注我(持续更新中,欢迎Star✨)
Github:CodeZeng1998/Java-Developer-Work-Note
(技术)微信公众号:CodeZeng1998
(生活)微信公众号:好锅
其他平台:CodeZeng1998、好锅
问题描述:Redis 超时异常,测试环境有时候由于网络波动的影响会出现Redis连接不上的问题。看报错信息能发现这里是多个Redis服务器均出现了连接超时的情况,Redis 集群同一时间出现连接不上的问题,有很大概率是网络问题导致的,当然实际情况还是要具体分析才行。
报错信息:
2025-03-13 11:02:54.578 ERROR 14444 [TID: N/A] --- [isson-timer-5-1] o.r.c.handler.PingConnectionHandler : Unable to send PING command over channel: [id: 0x9f2ec3b6, L:/192.150.33.5:1236 - R:172.0.0.1/172.0.0.1:6002]
org.redisson.client.RedisTimeoutException: Command execution timeout for command: (PING), params: [], Redis client: [addr=redis://172.0.0.1:6002]
at org.redisson.client.RedisConnection.lambda$async$0(RedisConnection.java:256) ~[redisson-3.25.0.jar:3.25.0]
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.run(HashedWheelTimer.java:706) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.concurrent.ImmediateExecutor.execute(ImmediateExecutor.java:34) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:694) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:781) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:494) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]
2025-03-13 11:02:54.578 ERROR 14444 [TID: N/A] --- [isson-timer-5-1] o.r.c.handler.PingConnectionHandler : Unable to send PING command over channel: [id: 0x6be9f391, L:/192.150.33.5:1238 - R:172.0.0.1/172.0.0.1:8001]
org.redisson.client.RedisTimeoutException: Command execution timeout for command: (PING), params: [], Redis client: [addr=redis://172.0.0.1:8001]
at org.redisson.client.RedisConnection.lambda$async$0(RedisConnection.java:256) ~[redisson-3.25.0.jar:3.25.0]
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.run(HashedWheelTimer.java:706) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.concurrent.ImmediateExecutor.execute(ImmediateExecutor.java:34) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:694) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:781) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:494) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]
2025-03-13 11:02:54.578 ERROR 14444 [TID: N/A] --- [isson-timer-5-1] o.r.c.handler.PingConnectionHandler : Unable to send PING command over channel: [id: 0x6487e24a, L:/192.150.33.5:1237 - R:172.0.0.1/172.0.0.1:6001]
org.redisson.client.RedisTimeoutException: Command execution timeout for command: (PING), params: [], Redis client: [addr=redis://172.0.0.1:6001]
at org.redisson.client.RedisConnection.lambda$async$0(RedisConnection.java:256) ~[redisson-3.25.0.jar:3.25.0]
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.run(HashedWheelTimer.java:706) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.concurrent.ImmediateExecutor.execute(ImmediateExecutor.java:34) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:694) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:781) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:494) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.107.Final.jar:4.1.107.Final]
at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]
错误原因:遇到的错误表明 Redisson 无法在指定时间内向 Redis 服务器发送 PING 命令以检查连接是否活跃。这可能是由于网络延迟、服务器不可用或客户端配置不当引起的。
解决方案:
我这边通过PING
和TELNET
直接就检查出了问题是网路的原因,各位如果不是网络的问题导致连接超时的可以按照以下步骤进行更加详细的排查,定位到问题后再解决具体的问题。
-
验证网络连接:
- 使用网络诊断工具检查客户端和服务器之间的延迟、数据包丢失或防火墙问题。确保端口开放且可访问。
-
检查服务器状态和资源:
- 确认 Redis 服务器运行且未过载。检查服务器日志是否有错误,监控 CPU、内存和连接数。高内存使用被指出为潜在因素。
-
调整 Redisson 配置:
-
将 timeout 设置增加,例如从 1000 毫秒增加到 5000 毫秒。
-
将 pingConnectionInterval 设置为适合的值,如 15000 毫秒,而不是默认的 30000 毫秒。
-
将 idleConnectionTimeout 调整为更高值,如 30000 毫秒,防止过早关闭连接。
-
示例配置片段:
Config config = new Config(); config.useSingleServer() .setAddress("redis://127.0.0.1:6379") .setConnectTimeout(5000) .setTimeout(5000) .setPingConnectionInterval(15000) .setIdleConnectionTimeout(30000);
-
这些设置可在 Redisson 配置文档中找到。
-
-
启用调试日志:
- 启用 Redisson 的调试日志以获取连接管理和命令执行的详细信息,帮助识别连接是否意外关闭。
-
审查服务器连接限制:
- 确保 Redis 服务器配置允许足够连接。检查 Redis 的 maxclients 设置,并相应调整 Redisson 的连接池大小(如 masterConnectionPoolSize、slaveConnectionPoolSize),避免超过服务器限制。
-
尝试传输模式:
- 尝试切换 Redisson 的传输模式(如从 NIO 切换到 EPOLL),特别是如果网络性能是问题所在。
-
考虑版本升级:
- 如果使用较旧版本的 Redisson,考虑升级到最新版本(如某些讨论中提到的 3.27.1),以受益于潜在修复。但需确保与 Redis 服务器版本兼容。
意想不到的发现
研究中的一个意想不到的细节是高服务器内存使用可能影响 PING 命令超时,即使网络检查看似正常。这表明服务器端资源约束(如内存压力)可能间接导致 PING 命令延迟响应,这从客户端日志中不一定明显。
配置设置的比较分析
为了组织关键配置参数及其潜在影响,考虑以下表格:
参数 | 默认值 | 建议调整 | 影响 |
---|---|---|---|
timeout | 1000 毫秒 | 增加到 5000 毫秒 | 允许 PING 命令有更多时间执行,减少超时。 |
pingConnectionInterval | 30000 毫秒 | 尝试 15000 毫秒 | 平衡连接检查频率与服务器负载。 |
idleConnectionTimeout | 10000 毫秒 | 增加到 30000 毫秒 | 防止空闲连接过早关闭,减少 PING 失败。 |
connectTimeout | 5000 毫秒 | 根据网络审查 | 确保连接建立不会过早超时。 |
masterConnectionPoolSize | 64 | 根据服务器调整 | 防止超过服务器连接限制,减少连接问题。 |
此表总结了各种 GitHub 问题中讨论的设置,可指导配置调整。
结论和建议
Redisson 的“Command execution timeout for command: (PING)”错误可能由网络问题、服务器过载和客户端配置不当共同引起。通过系统检查网络连接、验证服务器状态并调整 Redisson 的超时、PING 间隔和空闲连接超时,用户可以缓解这些错误。启用调试日志和审查服务器连接限制提供额外的诊断工具。
更多内容欢迎关注我(持续更新中,欢迎Star✨)
Github:CodeZeng1998/Java-Developer-Work-Note
(技术)微信公众号:CodeZeng1998
(生活)微信公众号:好锅
其他平台:CodeZeng1998、好锅