这怎么可能?平行。为了陌生

时间:2012-02-03 21:33:21

标签: c# performance linq parallel-processing

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

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

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

但是......当我启用一些日志记录来弄清楚为什么第二台服务器在执行与第一台服务器相同的事情时更好(更快),结果与您通常认为的现实应该是这样的结果不一致。

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

  

ÖVERKALIX - > table.Select [1]:78.125 ms doubles.AddRange:0 ms   结果[0]:0毫秒

     

ÖVERKALIX - > table.Select [1]:62.5 ms doubles.AddRange:0 ms结果   [0]:0毫秒

     

ÖVERTORNEÅ - > table.Select [1]:62.5 ms doubles.AddRange:0 ms结果   [0]:0毫秒

     

ÖVERTORNEÅ - > table.Select [1]:78.125 ms doubles.AddRange:0 ms   结果[0]:0毫秒

     

Total servertid att exekvera592frågor:20062.5 ms

来自第二个的日志(摘录):

  

ÖVERKALIX - > table.Select [1]:99 ms doubles.AddRange:0 ms结果   [0]:0毫秒

     

ÖVERKALIX - > table.Select [1]:103 ms doubles.AddRange:0 ms结果   [0]:0毫秒

     

ÖVERTORNEÅ - > table.Select [1]:100 ms doubles.AddRange:0 ms结果   [0]:0毫秒

     

ÖVERTORNEÅ - > table.Select [1]:104 ms doubles.AddRange:0 ms结果   [0]:0毫秒

     

Total servertid att exekvera592frågor:4479 ms

如果你看一下,你会发现这里有些奇怪的东西。第一台服务器比第二台服务器更快地执行所有单个查询,但所有查询的总时间超过第二台服务器......

WHY吗

您通常会想到的是,如果要执行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更快(更顺畅?)或大量查询?

可以从这些数字得出任何结论吗?

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

提前致谢!

1 个答案:

答案 0 :(得分:4)

这里有很多事情可以继续。

首先,我原本期望服务器2更快..毕竟它有更快的处理器。

无论:

您提到两台服务器都在运行您的应用;但两者都是虚拟机。

这些物理盒上还有什么?甚至虚拟机中还运行了什么?

它几乎可以是任何东西。也许服务器1还有一个VM,每隔一段时间就会运行一次预定的作业,这会占用您的资源...也许服务器1有一个完全不同的磁盘阵列,其写入缓存无法跟上需求并且必须经常暂停冲洗?

服务器1的NIC可能会因入站/出站数据而过载,这也是由某种类型的预定作业引起的。也许鲍勃,有用的系统管理员,喜欢登录服务器1,让它下载他的完全合法的msdn 软件。

重点是,没有人能够告诉你发生了什么,因为涉及太多变量。

我开始的地方:

  1. 确保除了您的虚拟机和应用程序外,其他服务器1上没有运行其他服务器。我的意思是绝对没有,没有预定的工作,没有其他应用程序,没有。对服务器2执行相同的操作。

  2. 资料。 CPU,磁盘和内存发生了什么。服务器1是否必须将内存分页到磁盘?换句话说,它是否有足够的RAM来保存您的应用程序及其所有数据而不必刷新它?服务器2怎么样?

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

  4. 我提到了剖析吗?暂停发生在哪里,暂停时物理硬件的状态是什么。你在每个盒子上处理相同的数据吗?

  5. 决定是否重要。这应该是数字1.毕竟,你有不同的硬件设计,你应该期望不同的性能结果。可能唯一真正重要的是服务器1有时会遇到停顿。在这种情况下,完全忽略服务器2和配置文件服务器1.