StackExchange Redis 超时以及如何在 .NET Core 中设置最小线程池数量?

Jos*_*h L 11 multithreading caching azure redis asp.net-core

当我尝试从突然出现在我的生产环境中的 azure redis 缓存中查询一个非常简单的字符串(我的应用程序日志级别)时,出现以下错误(此查询经常发生):

无法从 Redis 缓存反序列化日志级别:执行 GET 超时(5000 毫秒),下一步:GET LoggingLevel:ApplicationAPI,inst:2,qu:0,qs:1289,aw:False,rs:ReadAsync,ws:空闲,in:130355, serverEndpoint: XXXX mgr: 10 of 10 available, clientName: application-api-67cdbb4cfd-lkqdk, IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=3515,Free=29252 ,Min=1,Max=32767), v: 2.0.601.3402 (请查看这篇文章,了解一些可能导致超时的常见客户端问题: https ://stackexchange.github.io/StackExchange.Redis/Timeouts )

我已阅读他们建议的主题,还阅读了如何对 Azure Cache for Redi 进行故障排除

根据我在 Azure 仪表板中阅读的指标,我认为我没有超出当前的内存或连接限制。这似乎与我在线程池中设置的工作线程数有关。我读到我应该:

“将 IOCP 和 WORKER 线程的最小配置值设置为大于默认值”

我还了解到我可以使用 .NET Core 中的 api 设置最小线程数ThreadPool.SetMinThreads(Int32, Int32)

所以基本上我的问题是:

  1. 在 AKS 群集中运行应用程序时设置最小线程池是否安全?
  2. 我应该在哪里设置这个值?在 Program.cs 中?在 Startup.cs 中?
  3. 根据我上面看到的日志,将我的最低级别设置为 4000 是否安全?那么我是否高于工作线程的繁忙阈值?

bea*_*olf 7

我将直接尝试回答您的问题,因为您已经了解了根本问题。

  1. 如果您知道自己在做什么,那就安全(而且我认为您知道自己在做什么)。如果您在另一个 Kubernetes 集群服务甚至 IIS 中运行它,它也是安全的。

  2. 您可以在Program.csMain的方法中设置该值。

  3. 是的,您应该将其设置为 3515 以上(异常消息中的繁忙计数)并监视您的应用程序和节点指标。你可以从 4000 开始。然而,这是一个很高的数字(我不是说“太高”,只是说“高”)。因此,您可能需要创建更多 Pod,而不是增加这么多最小工作线程值。不幸的是,这里没有灵丹妙药。您必须尝试一个值,监视您的应用程序(响应时间、CPU、RAM 等),然后调整该值。