我们有一个在Azure App Service上运行的.NET 4.6.1 ASP.NET Web窗体应用程序.我说Web Forms,但该应用程序还包含Web Api 2,以及两个WebJob项目,每个项目执行几个任务.
我们使用StackExchange.Redis进行缓存.我们还将Redis用于SessionState.我提到这一点,因为问题始于Redis连接的建立,除非我们重新启动ASP.NET应用程序,否则它们不会死亡.我们使用Lazy模式重新传输ConnectionMultiplexer.本地测试确认连接确实在各个请求中共享.
我们对Redis配置充满信心,开始关注与ASP.NET应用程序相关的指标.线程计数反映了我们的Redis客户端图.问题是,我不知道什么是正常的线程数.但我希望他们能在几天内处理/消失/死亡.没有积累.
我们广泛使用Async/Await,但我们通常不直接处理线程.最后一行可能听起来有点幼稚,抱歉不知道怎么回事.我们倾向于在工作日看到最忙碌的时间,夜间活动最少.
我们不知所措,我们做错了什么?我是对的,我们是否应该看到线程数量下降而网站上的活动减少了?也许我已经说了一些你可以指出并说"你到底在做什么?"的东西,那就太好了.我真正追求的是对我们可能负责这些线程构建以及我们如何管理它的建议.
更新03/08
第二个图像中的线表由SUM聚合.如果将聚合更改为MIN,MAX或AVG,则会看到更合理的线程计数,它表明线程正确处理.对于网络应用来说,这显然是一个很大的缓解.
我假设,虽然我的谷歌搜索没有设法确认它,SUM表示自上次应用程序重新启动以来创建的线程总数.如果我在这个假设中是正确的,那么Web应用程序线程数的SUM与AVG Redis客户端计数相匹配的事实证实了我们最初的怀疑,即我们的连接多路复用器不仅不共享连接,它们也不会被关闭操作完成.
这是我们的Redis类,它与interweb上的其他1000个示例相同,至少据我所知:
Imports System.Configuration
Imports StackExchange.Redis
Public Class RedisCache
Private Shared ReadOnly Property LazyConnection As New Lazy(Of ConnectionMultiplexer)(Function()
Dim cacheConnection = ConfigurationManager.AppSettings("CacheConnection")
Dim multiplexer = ConnectionMultiplexer.Connect(cacheConnection.ToString())
multiplexer.PreserveAsyncOrder = False
Return multiplexer
End Function)
Public Shared ReadOnly Property Connection As ConnectionMultiplexer
Get
Return LazyConnection.Value
End Get
End Property
Public Shared ReadOnly Property UseCache As Boolean
Get
Return ConfigurationManager.AppSettings("CacheConnection") IsNot Nothing
End Get
End Property
End …Run Code Online (Sandbox Code Playgroud) 我们将应用程序部署到Azure。它正在使用Azure Redis缓存,并且我们遇到了很多超时。即:
[TimeoutException: Timeout performing GET textobjectDetails__23290_TextObject, inst: 1, mgr: Inactive, queue: 5, qu=0, qs=5, qc=0, wr=0/0, in=56864/0]
[TimeoutException: Timeout performing GET featured_series_CachedSeries, inst: 1, mgr: Inactive, queue: 4, qu=0, qs=4, qc=0, wr=0/0, in=44470/0]
[TimeoutException: Timeout performing GET SeriesByFranchiseId_1_CachedSeries, inst: 1, mgr: Inactive, queue: 3, qu=0, qs=3, qc=0, wr=0/0, in=11252/0]
[TimeoutException: Timeout performing GET media_silo-1-1-0_Media, inst: 1, mgr: Inactive, queue: 3, qu=0, qs=3, qc=0, wr=0/0, in=15188/0]
[TimeoutException: Timeout performing GET textobjectDetails__3092_TextObject, inst: 3, mgr: Inactive, queue: 7, qu=0, qs=7, qc=0, …Run Code Online (Sandbox Code Playgroud)