[我不确定是否在stackoverflow或serverfault中发布此内容,但由于这是一个C#开发项目,我将坚持使用stackoverflow ...]
我们有一个多层应用程序,在一天中不可预测的时间表现不佳,我们正在努力追查原因。它特别难以修复,因为我们无法在我们的开发环境中重现它 - 它只是我们生产服务器上的零星问题。
架构如下:运行MVC应用程序(C#)的负载均衡前端Web服务器(IIS)。本地服务总线,使用域集成模式运行的MSMQ实现。五个工人池'服务器,运行我们的Windows服务,响应总线上的请求。后端SQL Server 2012数据库,镜像和复制。
所有服务器都具有高规格硬件,运行Windows Server 2012,最新版本,最新Windows更新。所有事情都是最新的。
当用户点击MVC应用程序中的操作时,控制器本身非常薄。它所做的就是在总线上发出请求消息(发送MSMQ消息)并等待回复。
工作池中的一个服务器获取消息,找出要执行的操作,然后在SQL Server后端执行查询,并执行其他工作。然后将结果放回总线上,以便MVC应用程序使用Correlation ID进行备份。
在每个组件的简单性方面,它是一个很好的架构。随着需求的增加,我们可以简单地向工作池添加更多服务器,而且通常情况良好。它还允许我们在中间层热交换代码。大多数情况下,解决方案表现非常出色。
然而,如上所述,我们确实遇到了性能问题的时刻。事实证明,很难找到瓶颈所在的架构中的哪个点。
我们尝试做的是向总线发送请求并将其往返于MVC应用程序,并在消息中嵌入一整套时间和指标。在路由的每个站点上,时间戳和其他度量标准将添加到消息中。然后,当MVC应用程序收到回复时,我们可以屏幕转储时间戳和指标,并尝试确定该过程的哪个部分导致问题。
然而,我们很快意识到我们不能依赖Windows时间作为准确的衡量标准,因为我们的许多流程都降至5-100毫秒级别,并且消息可以通过5台服务器(并且再次返回) )。我们无法将服务器上的时间与该分辨率同步。 MS文章:http://support.microsoft.com/kb/939322/en-us
为了解决问题,每次发送请求时,我们都无法预测哪个特定的工作池服务器将处理该消息。
获得精确到5ms级别的准确,协调和同步时间的最佳方法是什么?如果我们必须在每个步骤呼叫外部(Web)服务,这将为该过程增加额外的时间,并且我们如何保证每个呼叫在每个服务器上花费相同的时间?即使在一台服务器上进行外部呼叫的少量延迟也会使结果产生偏差并给我们带来误报。
希望我已经解释了我们的困境并期待你的帮助。
更新
我刚刚发现了这个:http://www.pool.ntp.org/en/use.html,这可能很有希望。也许每隔x小时安排一次工作以保持时间同步可以让我达到我需要的低于5毫秒的分辨率。评论或经验?
更新2
FWIW,我们已经找到了性能问题的原因。当软件测试是否在打开队列之前创建了队列时,就会发生这种情况。所以它基本上是两次查找队列,这相当昂贵。所以这个问题已经消失了。
答案 0 :(得分:0)
您应该尝试使用Windows自身的性能监视器。您可以做的是在每台服务器上创建Data Collector Set并选择要监控的指标。像请求执行时间这样的东西将是一个很好的监控。
这是数据收集器集的教程:https://www.youtube.com/watch?v=591kfPROYbs
希望这可以帮助您解决问题。