【问题标题】:.NET and Load Balancer? [closed].NET 和负载均衡器? [关闭]
【发布时间】:2014-07-09 17:35:54
【问题描述】:

我们目前正在运行一个 Web 应用程序,并且经常遇到性能问题。具体来说,用户在一天中经常收到“挂起”的记录,而且几乎没有任何警告。我们还无法确定问题所在,但经过一些研究,我们认为这可能与我们的负载均衡配置和 .net 框架有关。我们想知道我们是否正在丢失应用程序中的会话,这会导致缓存问题。供应商声称这是我们对负载均衡器的配置,但我们尝试了很多方法,但无法解决这种情况。

到目前为止,我们唯一的解决方案是让用户关闭浏览器并重新打开浏览器并重新开始。不用说,他们对我们很生气。

系统规格(据我所知):

  1. 4 节点 Web 服务器集群,其中包含应用程序。使用循环格式的负载均衡器。

  2. 应用程序正在使用 .Net Framework v4.0.30319。

  3. SQL Server 在不同的服务器上单独运行。

我检查了错误日志,我们经常收到这些类型的错误:

  1. ASP.NET 会话已过期或找不到

  2. 无法缓存密钥....

  3. 无法创建缓存工厂。请验证此客户端上的 Microsoft AppFabric 设置是否正确。

继续

感谢您的快速回复。我们只是客户,并没有编写这个软件,所以请多多包涵,因为我仍在收集尽可能多的信息。为这种情况提供更多色彩:

  1. 会话状态为MVC下的InProc,主站以这个sessionState mode="Custom" customProvider="AppFabricCacheSessionStoreProvider

  2. 运行
  3. 我提到负载平衡器的唯一原因是因为我在论坛上看到了很多关于会话状态和“粘性”的信息。也就是说,在使用 .net 框架和负载均衡时维护会话。我们目前没有设置负载均衡器来根据用户发出 cookie 并打开“粘性”设置。

  4. 我们已将错误日志发送给供应商,但没有收到太多回复,这就是我转向论坛寻求答案的原因。 我们一直在尝试确定损坏缓存的来源,但一直无法做到。

4. 用户性能参差不齐。总体而言,与以前的版本相比,此版本的应用程序速度较慢。最令人担忧的是,用户在执行基本任务(进行搜索、打开大记录)时偶尔会“挂机”。 我忘了提到,当系统生成其中一些错误消息时,它并没有识别错误发生时登录的用户。以下是日志示例:

异常信息

ASP.NET 会话已过期或找不到

登录身份

堆栈跟踪位于 Microsoft.Reporting.WebForms.ViewerDataOperation..ctor() 在 Microsoft.Reporting.WebForms.HttpHandler.GetHandler(字符串 操作类型)在 Microsoft.Reporting.WebForms.HttpHandler.ProcessRequest(HttpContext 上下文)在 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤, Boolean & completedSynchronously)


我们只是客户,并没有编写这个软件,所以请多多包涵,因为我仍在收集尽可能多的信息。为这种情况提供更多色彩:

  1. 会话状态是MVC下的InProc,主站运行这个sessionState mode="Custom" customProvider="AppFabricCacheSessionStoreProvider
  2. 我提到负载平衡器的唯一原因是因为我在论坛上看到了很多关于会话状态和“粘性”的信息。也就是说,在使用 .net 框架和负载均衡时维护会话。我们目前没有设置负载平衡来根据用户发出 cookie,并启用了“粘性”设置。
  3. 我们已将错误日志发送给供应商,但没有收到太多回复,这就是我转向论坛寻求答案的原因。
  4. 我们一直在尝试确定损坏缓存的来源,但一直无法做到。
  5. 用户性能参差不齐。总体而言,与以前的版本相比,此版本的应用程序速度较慢。最令人担忧的是,用户在执行基本任务(进行搜索、打开大型记录)时偶尔会“挂机”。
  6. 我忘了提到,当系统生成其中一些错误消息时,它并没有识别错误发生时登录的用户。以下是日志示例:

异常信息

ASP.NET 会话已过期或找不到

登录身份

堆栈跟踪位于 Microsoft.Reporting.WebForms.ViewerDataOperation..ctor() 在 Microsoft.Reporting.WebForms.HttpHandler.GetHandler(字符串 操作类型)在 Microsoft.Reporting.WebForms.HttpHandler.ProcessRequest(HttpContext 上下文)在 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤, Boolean & completedSynchronously)

【问题讨论】:

  • 会话状态提供者仍然是默认的(InProc)还是一些自定义的(Sql)?
  • 为什么“挂起”和负载均衡器有关系?有没有指向这个方向的证据?
  • 缓存坏了怎么办?您收到了非常令人担忧的消息(2 和 3)。你调查过他们吗?它们是什么意思?

标签: c# .net caching web-applications load-balancing


【解决方案1】:

对于#1,使用负载均衡器,如果用户碰巧被交换到另一台服务器,那么他们现有的会话就会丢失。

【讨论】:

  • 除非服务器实例配置为使用 Sql 会话状态提供程序。在这种情况下,会话状态可以在所有 Web 服务器之间共享。
  • 我们没有使用 SQL Session 状态。
【解决方案2】:

会话错误告诉您它没有正确维护或最终过期。由于会话状态是自定义的,并且您为此提供了自定义提供程序,因此请查看会话数据(如果正确保存在该自定义位置)。

如果您可以将会话状态模式从自定义状态切换到状态服务器,则可以查明您的问题并向供应商指定更多信息。

您可以阅读以下链接以了解不同会话状态模式的概念。

http://msdn.microsoft.com/en-us/library/vstudio/ms178586(v=vs.100).aspx

【讨论】: