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)
。
所以基本上我的问题是:
我将直接尝试回答您的问题,因为您已经了解了根本问题。
如果您知道自己在做什么,那就安全(而且我认为您知道自己在做什么)。如果您在另一个 Kubernetes 集群服务甚至 IIS 中运行它,它也是安全的。
您可以在Program.csMain
的方法中设置该值。
是的,您应该将其设置为 3515 以上(异常消息中的繁忙计数)并监视您的应用程序和节点指标。你可以从 4000 开始。然而,这是一个很高的数字(我不是说“太高”,只是说“高”)。因此,您可能需要创建更多 Pod,而不是增加这么多最小工作线程值。不幸的是,这里没有灵丹妙药。您必须尝试一个值,监视您的应用程序(响应时间、CPU、RAM 等),然后调整该值。
归档时间: |
|
查看次数: |
8906 次 |
最近记录: |