2014-09-06 62 views
0

[我不知道是否在计算器或serverfault张贴此,但由于这是一个C#开发项目,我会坚持计算器...]多服务器n层同步时序和性能指标?

我们已经有了一个多层次的应用程序,在一天中不可预知的时间表现不佳,我们正试图找出原因。修复起来特别困难,因为我们无法在我们的开发环境中重现它 - 这只是我们生产服务器上的零星问题。

体系结构如下:运行MVC应用程序(C#)的负载均衡前端Web服务器(IIS)。本地服务总线,采用MSMQ在域集成模式下运行。五个'工作人员池'服务器,运行我们的Windows服务,响应总线上的请求。后端SQL Server 2012数据库,镜像和复制。

所有服务器都有高规格硬件,运行Windows Server 2012,最新版本,最新的Windows更新。一切都是最新的。

当用户在MVC应用中点击一个动作时,控制器本身非常薄。几乎所有的功能都是在总线上发送请求消息(发送MSMQ消息)并等待回复。

工作区池中的服务器之一会提取消息,计算出要执行的操作,然后在SQL Server后端执行查询并执行其他烦人的工作。然后将结果放回到总线上,以便MVC应用程序使用关联ID进行备份。

这是一个很好的体系结构,以便简化每个组件。随着需求的增加,我们可以简单地将更多的服务器添加到工作人员池中,并且一切正常。它还允许我们在中间层热插拔代码。大多数情况下,解决方案表现非常好。

但是,正如我们所述,我们确实有这些时刻性能是一个问题。事实证明,难以找出架构中哪一点是瓶颈。

我们试图做的事情是向公共汽车发送一个请求,并将其返回到MVC应用程序,并在消息中嵌入一整套时间和指标。在路由的每个停靠点上,都会将时间戳和其他指标添加到消息中。然后,当MVC应用程序收到回复时,我们可以筛选转储时间戳和度量标准,并尝试确定进程的哪个部分导致问题。

但是,我们很快意识到我们不能依赖Windows时间作为一个准确的衡量标准,因为我们的许多进程都低于5-100ms级别,并且消息可能会通过5台服务器(并返回再次)。我们无法将服务器上的时间同步到该分辨率。 MS文章:http://support.microsoft.com/kb/939322/en-us

为了使问题复杂化,每当我们发送请求时,我们都无法预测哪个特定的工作池服务器将处理该消息。

获得准确,协调和同步的时间精确到5ms的最佳方法是什么?如果我们必须在每个步骤呼叫外部(网络)服务,这会为流程增加额外的时间,并且我们如何保证每个呼叫在每台服务器上都花费相同的时间?即使在一台服务器上的外部呼叫中出现少量延迟,也会导致结果偏差,并给我们带来误判。

希望我已经解释了我们的困境,并期待您的帮助。

更新

我刚刚发现这一点:http://www.pool.ntp.org/en/use.html,这可能是有前途的。也许每隔x个小时计划一次工作以保持时间同步,可能会让我达到我需要的低于5毫秒的分辨率。评论或经验?

更新2

FWIW,我们发现性能问题的原因。它发生在软件测试队列是否在打开之前已经创建的时候。所以它实质上是两次查找队列,这相当昂贵。所以这个问题已经消失了。

回答

0

你应该尝试使用性能监视器,它是Windows本身的一部分。您可以执行的操作是在每台服务器上创建Data Collector Set,然后选择要监控的指标。像Request Execution Time这样的东西将是一个很好的监控。

这里有一个教程数据收集器集:https://www.youtube.com/watch?v=591kfPROYbs

希望这会给你诊断问题开始。

+0

我们使用perf mon很多,但我们需要跨所有服务器和分层协调跨整个堆栈的跟踪。我们不仅需要测量每台服务器上运行的进程,还要测量跨网络边界的传输和接收。没有这些,我无法确定它是代码,图层,硬件还是其他任何东西。 – SimonGoldstone 2014-09-06 23:12:45

+0

也许这可能是一个网络问题,通过5台服务器? – Ryan 2014-09-07 00:17:44

+0

可能,但我们已经做了大量的测试。网络很少超过5%。这就是为什么我需要检查整个堆栈。 – SimonGoldstone 2014-09-07 06:25:24