热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Azure上运行的ASP.NET应用程序不会删除Redis客户端

如何解决《在Azure上运行的ASP.NET应用程序不会删除Redis客户端》经验,应该怎么办?

我们有一个在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客户超过30天.

我们对Redis配置充满信心,开始关注与ASP.NET应用程序相关的指标.线程计数反映了我们的Redis客户端图.问题是,我不知道什么是正常的线程数.但我希望他们能在几天内处理/消失/死亡.没有积累.

Web应用程序线程超过30天.

我们广泛使用Async/Await,但我们通常不直接处理线程.最后一行可能听起来有点幼稚,抱歉不知道怎么回事.我们倾向于在工作日看到最忙碌的时间,夜间活动最少.

Web应用程序请求超过30天.

我们不知所措,我们做错了什么?我是对的,我们是否应该看到线程数量下降而网站上的活动减少了?也许我已经说了一些你可以指出并说"你到底在做什么?"的东西,那就太好了.我真正追求的是对我们可能负责这些线程构建以及我们如何管理它的建议.


更新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 Class

正如我已经提到的,我们也使用Redis作为会话状态,我们有一个非常基本的配置:


        
    

有没有人有什么想法延长这些客户的生命?


更新03/08第二部分

我一直在考虑如何缩小这个问题.最简单的起点是"它是Cache,Session还是Redis整体?" 为此,我们将启动一个额外的Redis服务器,在下一个版本中,它将具有指向它的Cache或Session State.希望其中一个服务器会表现出我们试图修复的相同行为,而另一个服务器表现出来,嗯,更好.两者的前者将是我们集中努力的地方.

在我们的测试环境中,我所做的另一件小事是创建一个测试属性,它以与Connection属性相同的方式生成一个新的GUID :

Private Shared ReadOnly Property LazyGuid As New Lazy(Of Guid)(Function() Guid.NewGuid())

Public Shared ReadOnly Property Guid As Guid
    Get
        Return LazyGuid.Value
    End Get
End Property

然后我创建了一些来自Web应用程序各个部分,新GUID属性以及现有Redis代码的调用:


Public Async Function GetGuid() As Task(Of Tuple(Of String, String))
    Return New Tuple(Of String, String)(RedisCache.Guid.ToString(), If(RedisCache.UseCache, RedisCache.Connection.ClientName, Nothing))
End Function


Public Async Function PostForGuid() As Task(Of Tuple(Of String, String))
    Return New Tuple(Of String, String)(RedisCache.Guid.ToString(), If(RedisCache.UseCache, RedisCache.Connection.ClientName, Nothing))
End Function


Public Function GetSyncGuid() As Tuple(Of String, String)
    Return New Tuple(Of String, String)(RedisCache.Guid.ToString(), If(RedisCache.UseCache, RedisCache.Connection.ClientName, Nothing))
End Function

上面的示例以及嵌入在ASPX页面中的一些调用跨多个会话(和时区)产生了相同的结果.所以目前我强烈怀疑这个错误RedisSessionStateProvider或者至少是我们对它的使用.


更新13/08

首先,我在测试服务器上运行了两个Redis实例大约一周.一个接受Session请求,另一个接受来自上面的RedisCache类的请求.两人都坐在15-20连接.

这个更新的要点虽然如此.我有想法在生产Redis上运行CLIENT LIST.由于客户端数量约为1.3k,我设法获取了850个客户端行的样本.

在整个样本中,有一个客户端有最后一个GET命令,其余的是UNSUBSCRIBEINFO.年龄范围从5000秒到65,000秒.空闲时间范围为0到60秒.据我所知,UNSUBSCRIBE命令与StackExchange.Redis对pub/sub功能的处理有关,据我所知,我没有使用它.

为什么这些客户保持活跃并成倍增长?

id=1367825 addr=*** fd=45 name=*** age=465516 idle=56 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 ow=0 owmem=0 events=r cmd=info numops=7680
id=1319911 addr=*** fd=611 name=*** age=489772 idle=48 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 ow=0 owmem=0 events=r cmd=info numops=8082
id=1409149 addr=*** fd=477 name=*** age=444591 idle=34 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 ow=0 owmem=0 events=r cmd=unsubscribe numops=7328
id=1319912 addr=*** fd=508 name=*** age=489772 idle=38 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 ow=0 owmem=0 events=r cmd=unsubscribe numops=8072
id=2169495 addr=*** fd=954 name=*** age=59035 idle=56 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 ow=0 owmem=0 events=r cmd=info numops=984
id=2169496 addr=*** fd=955 name=*** age=59035 idle=56 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 ow=0 owmem=0 events=r cmd=info numops=984
id=1219863 addr=*** fd=557 name=*** age=540498 idle=38 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 ow=0 owmem=0 events=r cmd=info numops=8917
id=1032642 addr=*** fd=594 name=*** age=635373 idle=56 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 ow=0 owmem=0 events=r cmd=unsubscribe numops=10474

更新14/08

一个潜在的积极发展.我在Github上记了一张票.听起来像我们症状的问题已在2.0中修复.永远不会死的客户


推荐阅读
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • 本文整理了Java中com.evernote.android.job.JobRequest.getTransientExtras()方法的一些代码示例,展示了 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
author-avatar
人民总动员
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有