背景:
使用windows server 2016 , IIS 部署的程序运行一段时间后出现异常, Redis 部署在内网其他服务器; 通过windows 事件查看器发现一些错误日志 , CSRedis.Internal.IO.RedisSocketException: Connect to server timeout 大概意思为连接redis服务 超时;
错误 2023/6/29 11:01:22 .NET Runtime 1000 无 "Category: Microsoft.AspNetCore.Session.SessionMiddleware
EventId: 1
RequestId: 80001312-0014-fb00-b63f-84710c7967bb
RequestPath: /Api/AndonCallRecord/AddAndonCallNotice
SpanId: |8ac4901c-4304374f5d1d9735.
TraceId: 8ac4901c-4304374f5d1d9735
ParentId:
Error closing the session.
Exception:
System.Exception: 【192.168.0.193:9004/0】状态不可用,等待后台检查程序恢复方可使用。Connect to server timeout
---> CSRedis.Internal.IO.RedisSocketException: Connect to server timeout
at CSRedis.Internal.IO.RedisSocket.Connect(EndPoint endpoint, Int32 timeout)
at CSRedis.Internal.RedisConnector.Connect(Int32 timeout)
at CSRedis.RedisClient.Connect(Int32 timeout)
at CSRedis.RedisClientPool.Return(Object`1 obj, Exception exception, Boolean isRecreate)
--- End of inner exception stack trace ---
at CSRedis.Internal.ObjectPool.ObjectPool`1.getFree(Boolean checkAvailable)
at CSRedis.Internal.ObjectPool.ObjectPool`1.GetAsync()
at CSRedis.CSRedisClient.GetClientAsync(RedisClientPool pool)
at CSRedis.CSRedisClient.GetAndExecuteAsync[T](RedisClientPool pool, Func`2 handerAsync, Int32 jump, Int32 errtimes)
at CSRedis.CSRedisClient.ExecuteScalarAsync[T](String key, Func`3 handerAsync)
at CSRedis.CSRedisClient.HMGetAsync(String key, String[] fields)
at Microsoft.Extensions.Caching.Redis.CSRedisCache.GetAndRefreshAsync(String key, Boolean getData, CancellationToken token)
at Microsoft.Extensions.Caching.Redis.CSRedisCache.RefreshAsync(String key, CancellationToken token)
at Microsoft.AspNetCore.Session.DistributedSession.CommitAsync(CancellationToken cancellationToken)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
"
原因分析:
1. 在服务端检查连接数及连接信息,并无发现异常; 最大连接数 1000, 当前连接数 24;
2. 检查服务端及程序运行服务器资源情况, 没有发现问题;
3. 查阅csredis github 网站, Issus 中搜索 "超时", 发现找到了很多同病相怜的伙伴; 看来问题应该快要解决了,
解决办法:
翻阅文档, 发现其中有几个配置项值得关注, 尝试修改这几个参数来观察改善情况
poolsize 连接池大小
idleTimeout 空闲时间
preheat 预连接(可能翻译不太准确, 大概这个意思)
实施效果:
待补充...`