【问题标题】:Stackexchange.Redis timeout exception in .net-core.net-core 中的 Stackexchange.Redis 超时异常
【发布时间】:2017-08-14 20:18:51
【问题描述】:

我正在将 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)

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

更新添加了keep-alive配置但仍然失败

有什么想法吗?

【问题讨论】:

  • 重试是否有效?
  • @BrokenGlass 是的,默认值为“3”(次)

标签: c# .net asp.net-core-mvc .net-core stackexchange.redis


【解决方案1】:

您是否尝试过增加可用线程? (注意,这不是来自 .Net Core 项目,所以我不能 100% 确定语法是否相同。)

我在 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);       

【讨论】:

  • 对不起,它没有帮助。我不能在网络核心中使用这种方法。尝试了另一种可行的解决方案。
【解决方案2】:

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

【讨论】:

  • 你能告诉我把这个配置放在哪里吗?
  • 这应该是您到 Redis 的连接字符串的一部分,例如 "redis.cache.windows.net,password=y+v1,ssl=True,abortConnect=False,synctimeout=10000"
【解决方案3】:

更新的 SyncTimeout 不是一个好的选择,因为您的 redis 命令运行速度非常慢 超时原因是 .net-core 默认线程池中的线程数太少。

只需在环境变量中设置 maxThreads 即可。

例如:

ComPlus_ThreadPool_ForceMaxWorkerThreads 1000 ComPlus_ThreadPool_ForceMinWorkerThreads 50

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

对我有用

【讨论】:

  • 我刚刚添加到 docker ComPlus_ThreadPool_ForceMinWorkerThreads 100 并且看起来它可以工作。但是,您能描述一下为什么这如此重要吗?我正在使用来自 redis 的同步版本的 Add/Get 等 - 但在异步方法中..
【解决方案4】:

我在我的 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 发生
猜你喜欢
  • 2021-01-29
  • 2014-10-23
  • 1970-01-01
  • 2019-01-10
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
相关资源
最近更新 更多