Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多服务器n层同步计时和性能指标?_C#_Asp.net_Asp.net Mvc_Time_Windows Server - Fatal编程技术网

C# 多服务器n层同步计时和性能指标?

C# 多服务器n层同步计时和性能指标?,c#,asp.net,asp.net-mvc,time,windows-server,C#,Asp.net,Asp.net Mvc,Time,Windows Server,[我不确定是在stackoverflow还是serverfault中发布,但由于这是一个C#开发项目,我将坚持使用stackoverflow…] 我们有一个多层应用程序,它在一天中不可预测的时间表现出较差的性能,我们正在努力找出原因。修复它特别困难,因为我们无法在开发环境中复制它——这只是生产服务器上的一个零星问题 该体系结构如下:运行MVC应用程序(C#)的负载平衡前端web服务器(IIS)。一种自主开发的服务总线,通过在域集成模式下运行的MSMQ实现。五个“工作池”服务器,运行我们的Wind

[我不确定是在stackoverflow还是serverfault中发布,但由于这是一个C#开发项目,我将坚持使用stackoverflow…]

我们有一个多层应用程序,它在一天中不可预测的时间表现出较差的性能,我们正在努力找出原因。修复它特别困难,因为我们无法在开发环境中复制它——这只是生产服务器上的一个零星问题

该体系结构如下:运行MVC应用程序(C#)的负载平衡前端web服务器(IIS)。一种自主开发的服务总线,通过在域集成模式下运行的MSMQ实现。五个“工作池”服务器,运行我们的Windows服务,响应总线上的请求。后端SQL Server 2012数据库,镜像和复制

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

当用户点击MVC应用程序中的某个动作时,控制器本身非常薄。它所做的几乎就是在总线上放置一条请求消息(发送一条MSMQ消息)并等待回复

工作池中的一台服务器接收消息,确定要做什么,然后在SQL Server后端执行查询,并执行其他繁重的工作。然后将结果放回总线上,以便MVC应用程序使用相关ID重新获取

就每个单独组件的简单性而言,这是一个很好的架构。随着需求的增加,我们可以简单地向工作池添加更多服务器,一切正常。它还允许我们在中间层热交换代码。大多数情况下,该解决方案的性能非常好

然而,正如前面所说的,我们确实存在性能问题。事实证明,很难找到体系结构中瓶颈所在的位置

我们试图做的是通过总线发送一个请求,并将其返回到MVC应用程序,消息中嵌入了一整套计时和指标。在路线上的每个站点,时间戳和其他度量都会添加到消息中。然后,当MVC应用程序收到回复时,我们可以在屏幕上转储时间戳和度量,并尝试确定流程的哪个部分导致了问题

然而,我们很快意识到,我们不能依赖Windows时间作为准确的度量,因为我们的许多进程都已降至5-100ms的水平,并且一条消息可以通过5台服务器(然后再返回)。我们无法将服务器上的时间同步到该分辨率。MS article:

使问题更加复杂的是,每次发送请求时,我们都无法预测哪个工作池服务器将处理该消息

获得精确到5毫秒水平的精确、协调和同步时间的最佳方法是什么?如果我们必须在每一步调用外部(web)服务,这将为流程增加额外的时间,我们如何保证每个调用在每个服务器上花费相同的时间?在一台服务器上进行的外部调用中,即使存在少量延迟,也会使结果出现偏差,并给我们一个误报

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

更新

我刚刚发现了这个:,这可能是有希望的。也许每x小时安排一次作业以保持时间同步可以使我达到所需的低于5毫秒的分辨率。评论还是经验

更新2


FWIW,我们找到了性能问题的原因。当软件在打开队列之前测试队列是否已创建时,会发生此错误。因此,它实际上是在队列中查找两次,这相当昂贵。因此,问题已经消失。

您应该尝试使用性能监视器,它是Windows本身的一部分。您可以做的是在每个服务器上创建一个数据库,并选择要监视的指标。像请求执行时间这样的东西是一个很好的监视对象

以下是有关数据采集器集的教程:


希望这将为您解决问题提供一个开始

我们经常使用perf-mon,但我们需要跨整个堆栈、跨所有服务器和层协调跟踪。我们不仅需要检测每台服务器上运行的进程,还需要检测跨网络边界的传输和接收。如果没有这些,我无法确定是代码、层、硬件还是其他任何东西。可能是,但我们已经做了大量的测试。该网络很少超过5%。这就是为什么我需要检查整个堆栈。