Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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# 这怎么可能?平行的,奇怪的_C#_Performance_Linq_Parallel Processing - Fatal编程技术网

C# 这怎么可能?平行的,奇怪的

C# 这怎么可能?平行的,奇怪的,c#,performance,linq,parallel-processing,C#,Performance,Linq,Parallel Processing,我有两台不同规格的服务器,但它们都运行相同的应用程序 服务器1是一个2 x 2.4 Ghz的Hyper-V,服务器是一个VPS,具有2 x Intel Xeon CPU E5540 2.53Ghz 我有一个通用处理程序,它从表单中获取一些内容,并使用parallel.For以并行方式处理一些对象列表上的一些数据。我使用默认的MaxDegreeOfParallelism。没什么奇怪的 但是。。。当我启用一些日志来找出为什么第二台服务器比第一台服务器做的事情更好(更快)时,结果与您通常认为的实际情况

我有两台不同规格的服务器,但它们都运行相同的应用程序

服务器1是一个2 x 2.4 Ghz的Hyper-V,服务器是一个VPS,具有2 x Intel Xeon CPU E5540 2.53Ghz

我有一个通用处理程序,它从表单中获取一些内容,并使用parallel.For以并行方式处理一些对象列表上的一些数据。我使用默认的MaxDegreeOfParallelism。没什么奇怪的

但是。。。当我启用一些日志来找出为什么第二台服务器比第一台服务器做的事情更好(更快)时,结果与您通常认为的实际情况不一致

“问题”是,我有来自服务器1的日志,如下所示(摘录):

ÖVERKALIX->table.选择[1]:78.125毫秒双精度。添加范围:0毫秒 结果[0]:0ms

ÖVERKALIX->table.选择[1]:62.5毫秒双精度。添加范围:0毫秒结果 [0]:0毫秒

ÖVERTORNEÅ->表格。选择[1]:62.5毫秒双精度。添加范围:0毫秒结果 [0]:0毫秒

ÖVERTORNEÅ->表格。选择[1]:78.125毫秒双精度。添加范围:0毫秒 结果[0]:0ms

总服务器TID att exekvera 592 frågor:20062.5毫秒

和第二个类似的日志(节选):

ÖVERKALIX->table.选择[1]:99毫秒双精度。添加范围:0毫秒结果 [0]:0毫秒

ÖVERKALIX->table.选择[1]:103毫秒双精度。添加范围:0毫秒结果 [0]:0毫秒

ÖVERTORNEÅ->表格。选择[1]:100毫秒双精度。添加范围:0毫秒结果 [0]:0毫秒

ÖVERTORNEÅ->表格。选择[1]:104毫秒双精度。添加范围:0毫秒结果 [0]:0毫秒

总服务器TID att exekvera 592 frågor:4479毫秒

如果你看它,你会发现这里有些奇怪。第一台服务器执行所有单个查询的速度比第二台服务器快,但所有查询的总时间比第二台服务器长

为什么?

您通常会认为,如果有n个操作要完成,并且每个操作需要t ms,那么操作的总时间不应该超过如果您有n个操作,并且每个操作需要(例如)(t+1)ms

但不管怎样,我们这里的日志说t>(t+1)是真的。我很失望!嗯,我不是专家,但那是不可能的:)

那么,你对此有何看法

是因为一些超阅读的东西吗

是不是因为在第一台服务器上生成新线程需要更多的时间(这似乎是最合理的答案)

如果这是由于线程创建问题造成的,有什么方法可以衡量这一点吗

更新:

我已经深入研究了这个问题,出现了一种模式。以下是来自服务器1的一些数据(时间单位为毫秒):

78.125 187.5 78.125 93.75 750 62.5 62.5 62.5 78.125 46.875 78.125 46.875 1203.125 62.5 1125 78.125 2500 62.5 46.875 78.125 62.5 62.5 1484.375 62.5 62.5 1437.5 62.5 78.125

下面是在服务器2上执行的相同查询:

104 104 156 116 117 116 114 115 112 107 110 112 164 128 128 124 112 111 99 104 109 105 241 115 116 115 112 112

如您所见,服务器1速度更快,但有时(如值:1203.125、1484.375和2500)比服务器2花费的时间要长得多

因此,似乎服务器1在一小部分查询上更快,而服务器2更快(更平滑?)还是在一大部分查询上更快

从这些数字可以得出什么结论吗

为什么我们会看到这些差异


提前谢谢

这里可能会发生很多事情

首先,我希望服务器2更快。。毕竟它有更快的处理器

不管:

您提到两台服务器都在运行您的应用程序;然而,两者都是虚拟机

这些物理盒子上还运行着什么?或者虚拟机中还运行着什么

它可以是任何东西。可能服务器1也有一个VM,它每隔一段时间运行一个计划作业,占用您的资源。。。可能服务器1有一个完全不同的磁盘阵列,其写缓存不能满足需求,必须每隔一段时间暂停刷新

服务器1的NIC可能因入站/出站数据过载,这同样是由某种类型的计划作业造成的。也许Bob,一个一直乐于助人的系统管理员,喜欢登录服务器1,让它下载他完全合法的msdn软件

关键是,并没有人能够告诉你们发生了什么,因为涉及的变量太多了

我的起点是:

  • 确保除VM和应用程序外,服务器1上未运行任何其他内容。我的意思是什么都没有,没有预定的工作,没有其他的应用程序,什么都没有。对服务器2执行同样的操作

  • 个人资料。CPU、磁盘和内存发生了什么变化。服务器1是否必须将内存分页到磁盘或从磁盘分页?换句话说,它是否有足够的内存来保存你的应用程序及其所有数据,而不必刷新它?服务器2呢

  • 如果进行磁盘读取,两台机器之间的驱动器特性是什么。在几乎相同的机器上,您可能会有完全不同的性能,而实际上唯一的区别是,一台机器在RAID 0配置中有一个15k RPM SCSI驱动器,另一台机器有一个5400RPM PATA驱动器

  • 我提到过剖析吗?暂停发生在何处,暂停时物理硬件的状态如何。您是否正在处理每个框上的相同数据

  • 决定它是否重要。这应该是第一位。毕竟,您有不同的硬件,因此,您应该期望不同的性能结果。可能唯一真正重要的是服务器1有时会出现暂停。在这种情况下,完全忽略服务器2和概要文件服务器1


  • 这里有太多的东西可能是