c# - 使用 StackExchange.Redis 超时异常的原因可能是什么?

标签 c# azure redis stackexchange.redis azure-redis-cache

我在使用 StackExchange.Redis 1.2.0.0 执行操作时时不时会收到此错误在 Azure 应用服务上运行的 ASP.NET 应用中的 Azure Redis 上:

Timeout performing EXISTS bookmark:afad5065-29b1-48c7-8bbc-38ddcc9ab4e4type:1, inst: 1, mgr: Inactive, err: never, queue: 3, qu: 0, qs: 3, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, clientName: mywebapp, serverEndpoint: Unspecified/myapp.redis.cache.windows.net:6380, keyHashSlot: 8377, IOCP: (Busy=1,Free=999,Min=200,Max=1000), WORKER: (Busy=1,Free=32766,Min=200,Max=32767), Local-CPU: unavailable (Please take a look at this article for some common client-side issues that can cause timeouts: <a href="https://github.com/StackExchange/StackExchange.Redis/tree/master/Docs/Timeouts.md" rel="noreferrer noopener nofollow">https://github.com/StackExchange/StackExchange.Redis/tree/master/Docs/Timeouts.md</a>) System.TimeoutException

使用以下配置进行连接:allowAdmin=true,ssl=true,abortConnect=false,connectTimeout=5000,syncTimeout=2000 .

客户端机器和 Redis 服务在这段时间内都没有经历高负载。 已阅读 timeouts已经但仍然不知道是什么导致了我的情况。将不胜感激任何帮助。

最佳答案

超时可能由 client-side 引起或server-side性能问题,因此您必须从两方面进行分析以确定导致应用程序出现问题的原因。

需要考虑的一些事情:

  • 在 Azure 门户中查看客户端或服务器端性能计数器时,请注意查看相对较小的时间窗口(例如 1 小时)。这很重要,因为当您缩小到更长的时间窗口时,门户会聚合值,这可以隐藏负载中的短暂峰值
  • 许多性能计数器是通过采样而不是连续监控来捕获的,因此负载峰值的时间可能不足以显示在门户中。例如,如果每 15 秒记录一次 CPU 使用情况,但 CPU 峰值仅持续 5 秒,则这种情况可能发生在样本之间,并且不会被看到。这就是为什么 StackExchange.Redis 在即将抛出超时时 try catch 瞬时 CPU 使用情况。不幸的是,某些环境不允许访问系统性能计数器 - 因此超时错误中会出现“local-cpu: unavailable”消息。为了解决这个问题,您可以尝试在超时发生时捕获进程的转储。转储通常包含进行转储时的 CPU 信息。

我整理了一份best practices的列表这有助于避免 Redis 中的常见陷阱。

如果您仍然没有看到任何明确的问题迹象,请向 Azure 提交支持案例,他们将帮助您进行调查。

关于c# - 使用 StackExchange.Redis 超时异常的原因可能是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43849927/

相关文章:

C#异步方法的使用

azure - 将 CSV 从 Azure 自动化导出到 Microsoft Teams,而不是 Blob 存储?

c# - 在 .Net Core 中使用 smtp 服务器发送电子邮件?

javascript - Excel *.xlsx 文件不再允许我们进行计算和返回结果

c# - Azure EventHub - EventHubClient.Send() 导致 NullReferenceException

azure - 将最新文件从 S3 复制到 Azure Blob(使用 Azure Factory V2)

Redis:为什么 Lua 脚本要取代事务?

php - Predis 空批量回复

Redis 和对象版本控制

c# - 如何在后台运行 .NET 控制台应用程序