0

在应用服务器负载较重的情况下,使用 CacheManager.NET 和 Redis 作为后端时,偶尔会出现以下错误,

Redis Connection Timeout Exception :Timeout performing SCRIPT, inst: 0, mgr: CheckForStaleConnections, err: never, queue: 11596, qu: 11596, qs: 0, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, clientName: HOST, serverEndpoint: Unspecified/SREDIS01:6379, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=0,Free=2047,Min=4,Max=2047), Local-CPU: 4.84% (Please take a look at this article for some common client-side issues that can cause timeouts: https://github.com/StackExchange/StackExchange.Redis/tree/master/Docs/Timeouts.md), While GetOrAdd key :XYZ|

尽管我们在 ConnectionMultiplexer 中将 SyncTimeout 设置为 10000(10 秒),将 ConnectTimeout 设置为 5 秒,但系统会卡住大约 50 到 60 分钟(有时甚至更长)。请注意,仅在执行缓存管理器在初始化时执行的 SCRIPT 命令时才会出现此问题。

堆栈跟踪是:

   at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor`1 processor, ServerEndPoint server)
   at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor`1 processor, ServerEndPoint server)
   at StackExchange.Redis.RedisServer.ExecuteSync[T](Message message, ResultProcessor`1 processor, ServerEndPoint server)
   at StackExchange.Redis.RedisServer.ScriptLoad(String script, CommandFlags flags)
   at StackExchange.Redis.LuaScript.Load(IServer server, CommandFlags flags)
   at CacheManager.Redis.RedisCacheHandle`1.LoadScripts()
   at CacheManager.Redis.RedisCacheHandle`1.Eval(ScriptType scriptType, RedisKey redisKey, RedisValue[] values, CommandFlags flags)
   at CacheManager.Redis.RedisCacheHandle`1.<>c__DisplayClass48_0.<GetCacheItemAndVersion>b__0()
   at CacheManager.Redis.RetryHelper.Retry[T](Func`1 retryme, Int32 timeOut, Int32 retries, ILogger logger)
   at CacheManager.Redis.RedisCacheHandle`1.Retry[T](Func`1 retryme)
   at CacheManager.Redis.RedisCacheHandle`1.GetCacheItemAndVersion(String key, String region, Int32& version)
   at CacheManager.Redis.RedisCacheHandle`1.GetCacheItemInternal(String key, String region)
   at CacheManager.Core.Internal.BaseCache`1.GetCacheItem(String key, String region)
   at CacheManager.Core.BaseCacheManager`1.GetCacheItemInternal(String key, String region)
   at CacheManager.Core.Internal.BaseCache`1.GetCacheItem(String key, String region)
   at CacheManager.Core.Internal.BaseCache`1.Get(String key, String region)

我浏览了 StackExchange Redis 的 Timeout 文档,可以理解由于客户端计算机上的 CPU 使用率非常高,一些连接可能会遇到此类问题。

然而,我们最大的担忧是它应该在 10 秒内超时,并且不应该停留几分钟/几小时。

你能在这里指导我们吗?

4

0 回答 0