2881099 / csredis

.NET Core or .NET Framework 4.0+ client for Redis and Redis Sentinel (2.8) and Cluster. Includes both synchronous and asynchronous clients.
MIT License
2.01k stars 414 forks source link

状态不可用,等待后台检查程序恢复方可使用 #476

Open ZUOXIANGE opened 1 year ago

ZUOXIANGE commented 1 year ago

近期我们生产环境出现这个错误的频率很高.Redis是购买的阿里云8GB主从版,QPS在500左右,高峰能到1000.查询以往的issue之后修改链接字符串如下,但是情况没有得到改善.还有什么我能尝试的方法吗?

redis.rds.aliyuncs.com:6379,password=123456,defaultDatabase=0,autoDispose=false,poolsize=200,idleTimeout=200000,testcluster=false,tryit=3

还有这个错误也是一起发生的

Connection was not opened CSRedis.RedisClientException: Connection was not opened at CSRedis.CSRedisClient.GetAndExecuteAsync[T](RedisClientPool pool, Func2 handerAsync, Int32 jump, Int32 errtimes) at CSRedis.CSRedisClient.ExecuteScalarAsync[T](String key, Func3 handerAsync) at CSRedis.CSRedisClient.CacheShellAsync[T](String key, Int32 timeoutSeconds, Func`1 getDataAsync)

2881099 commented 1 year ago

不是局域网防火墙有限制

或者 域名ip已发生变化

ZUOXIANGE commented 1 year ago

已经联系阿里云排查过网络问题,没有这方面的限制

2881099 commented 1 year ago

可以自行做一个压力测试,错误确实是 socket 未连接导致。

ZUOXIANGE commented 1 year ago

可能的报错场景是什么呢?我自行模拟的QPS1000的场景不能复现这个,生产环境把连接池改小为20以下就极大程度缓解了这个问题,有什么可能的原因吗

2881099 commented 1 year ago

模拟环境,必须网络也一样,不要测试本地。

2881099 commented 1 year ago

我的意思很明白,网诺问题,上面给你分析了,

模拟只是让你论证。

ZUOXIANGE commented 1 year ago

就是发布到服务器测试的

xiaolei000129 commented 1 year ago

我也约到这个问题了,你们解决了吗?

xiaolei000129 commented 1 year ago

换成freeRdis 是否能够解决这个问题

ZUOXIANGE commented 1 year ago

我也约到这个问题了,你们解决了吗?

暂时通过把连接池改小缓解了

ZUOXIANGE commented 1 year ago

换成freeRdis 是否能够解决这个问题

正在切换到StackExchange.Redis

xiaolei000129 commented 1 year ago

换成freeRdis 是否能够解决这个问题

正在切换到StackExchange.Redis

测试结果可以和我同步一下吗?我目前也很需要

xiaolei000129 commented 1 year ago

换成freeRdis 是否能够解决这个问题

正在切换到StackExchange.Redis 为什么改小,不是改大更好吗?

ZUOXIANGE commented 1 year ago

换成freeRdis 是否能够解决这个问题

正在切换到StackExchange.Redis 为什么改小,不是改大更好吗?

我也不是很清楚,但是这样改暂时有用.换用StackExchange.Redis的接口暂时还没有出现报错

xiaolei000129 commented 1 year ago

换成freeRdis 是否能够解决这个问题

正在切换到StackExchange.Redis 为什么改小,不是改大更好吗?

我也不是很清楚,但是这样改暂时有用.换用StackExchange.Redis的接口暂时还没有出现报错

好的谢谢,我也之能切换了,现在影响到业务了

xiaolei000129 commented 1 year ago

确定切换之后运行的环境和之前出问题的环境一致把,因为切换还是挺需要时间的

xiaolei000129 commented 1 year ago

换成freeRdis 是否能够解决这个问题

正在切换到StackExchange.Redis 为什么改小,不是改大更好吗?

我也不是很清楚,但是这样改暂时有用.换用StackExchange.Redis的接口暂时还没有出现报错

你们现在使用的怎么样了,我目前还是不行

xiaolei000129 commented 1 year ago

切换了库也超时

ZUOXIANGE commented 1 year ago

那可能不是一个原因,我说的方法只针对我的情况有用

xwb2535 commented 1 year ago

不知道你们的是否发布到linux模式使用,我在linux模式下会超时,不一定并发很高,k8s和docker模式下超时概率很大。但是在windows服务器下几乎没有。发一个接口,然后用jemter压测一下,很容易就超时了,可以试一下是不是。

2881099 commented 1 year ago

基本都是远程访问超时,原因是处理不过来,压测超过了阀值(网络传输)

xiaolei000129 commented 1 year ago

基本都是远程访问超时,原因是处理不过来,压测超过了阀值(网络传输)

不知道需要怎么处理

2881099 commented 1 year ago

加钱升级服务器

sky201955 commented 1 year ago

是一个连接池用一个线程来管理吗? 线程池创建一个新的连接,是否需要一个新的线程? 线程调度是否可能导致超时?

NetFreeOps commented 10 months ago
 System.Exception: 【10.0.10.10:6379/0】状态不可用,等待后台检查程序恢复方可使用。ERR max number of clients reached
  Command: PING 
   ---> CSRedis.RedisException: ERR max number of clients reached

         System.Exception: 【10.0.10.10:6379/0】状态不可用,等待后台检查程序恢复方可使用。Unable to write data to the transport connection: 远程主机强迫关闭了一个现有的连接。.
   ---> System.IO.IOException: Unable to write data to the transport connection: 远程主机强迫关闭了一个现有的连接。.
   ---> System.Net.Sockets.SocketException (10054): 远程主机强迫关闭了一个现有的连接。
     at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 count)
     --- End of inner exception stack trace ---
     at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 count)
     at CSRedis.Internal.IO.RedisIO.Write(Byte[] data)
     at CSRedis.Internal.RedisConnector.Call[T](RedisCommand`1 command)
     at CSRedis.RedisClient.Write[T](RedisCommand`1 command)
     at CSRedis.RedisClient.Ping()
     at CSRedis.RedisClientPoolPolicy.OnCheckAvailable(Object`1 obj)
     at CSRedis.RedisClientPoolPolicy.PrevReheatConnectionPool(ObjectPool`1 pool, Int32 minPoolSize)
     --- End of inner exception stack trace ---
     at CSRedis.Internal.ObjectPool.ObjectPool`1.GetFree(Boolean checkAvailable)
     at CSRedis.Internal.ObjectPool.ObjectPool`1.Get(Nullable`1 timeout)
     at CSRedis.CSRedisClient.GetAndExecute[T](RedisClientPool pool, Func`2 handler, Int32 jump, Int32 errtimes)
     at CSRedis.CSRedisClient.ExecuteScalar[T](String key, Func`3 hander)
     at CSRedis.CSRedisClient.Set(String key, Object value, TimeSpan expire, Nullable`1 exists)
     at RedisHelper`1.Set(String key, Object value, TimeSpan expire, Nullable`1 exists)

     我的也是经常这样,我隔几天就要重启一下
2881099 commented 10 months ago

ERR max number of clients reached