Stackexchange.Redis在.net-core中的超时异常

10
我正在将一个.NET 4库移植到.NET Core 1.0.0-preview 2。在开发我的.NET Core库时,它使用的是Stackexchange.Redis版本1.2.1,而.NET 4版本使用的是1.2.0。在.NET 4中,调用Redis命令时,我的库从未出现过错误。但在.NET Core中,我会随机地遇到以下错误:
 System.TimeoutException: Timeout performing GET netkey, inst: 6, queue: 10, qu: 0, qs: 10, qc: 0, wr: 0, wq: 0, in: 645, ar: 0, clientName: XXXXXX, serverEndpoint: Unspecified/XXXXXXX, keyHashSlot: XXXXX(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)
   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.RedisDatabase.StringGet(RedisKey key, CommandFlags flags)

更新 我正在使用默认配置(连接超时,连接重试等)

更新 添加了保持连接配置,但仍然失败

有任何想法吗?


重试后它能工作吗? - BrokenGlass
@BrokenGlass 是的,"3" (次数) 是默认值。 - Jawen
4个回答

5

更新同步超时时间不是好的选择,因为您的 Redis 命令运行非常缓慢。造成超时的原因是 .NET Core 默认线程池中的线程计数太低。

只需设置环境变量中的 maxThreads。

例如:

ComPlus_ThreadPool_ForceMaxWorkerThreads 1000 ComPlus_ThreadPool_ForceMinWorkerThreads 50

然后以管理员身份运行应用程序(允许应用程序读取系统环境变量)。

对我很有效。


1
我刚刚在Docker中添加了ComPlus_ThreadPool_ForceMinWorkerThreads 100,看起来它运作正常。不过,你可以描述一下为什么这很重要吗?尽管我在异步方法中使用了Redis的同步版本的Add/Get等操作。 - Adrian Stanisławski

3

解决方案:将SyncTimeout配置更新为10000。尝试使用5000失败,然后使用10000修复。默认值为1000。


2
请问你能告诉我在哪里放置这个配置吗? - Dakait
这应该是您连接 Redis 的连接字符串的一部分,例如 "redis.cache.windows.net,password=y+v1,ssl=True,abortConnect=False,synctimeout=10000"。 - Sergey_T

1
你尝试过增加可用线程吗?(注意,这不是来自 .Net Core 项目,所以我不能百分之百确定语法是否相同。)
我在 Global.asax.cs 的 Application_Start 方法中有以下内容:
private static int THREAD_MIN = 50; // 4 cores in production = 200
...                
//Per Redis docs, upping the number of threads available to handle the IO demands on the cloud.   
//https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Timeouts.md 
ThreadPool.SetMinThreads(THREAD_MIN, THREAD_MIN);       

抱歉,它没有帮助。我不能在Net Core中使用这种方法。尝试了另一种解决方案,它起作用了。 - Jawen

0
我在我的ASP MVC .NET Core 2.1项目中使用Microsoft.Extensions.Caching.Redis(2.1.2),并且在调用服务IDistributedCache的同步方法GetString(key)时也遇到了TimeoutException。解决方案是改为调用异步方法:
var val = await distributedCache.GetStringAsync(key)

问题已经不再出现。


在这里仍然使用await async。 - rfcdejong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接