2012-02-03 107 views
0

我有2个服务器有不同的规格,但他们都运行相同的应用程序。这怎么可能? Parallel.For奇怪

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

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

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

“问题” 时,予有从服务器1,它看起来像这样(摘录)日志:

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

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

ÖVERTORNEÅ - > table.Select [1]: 62.5 ms加倍.AddRange:0 ms结果 [0]:0 ms

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

总servertid ATT exekvera 592frågor:20062.5毫秒

而一个记录从第二个这样的(摘录):

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

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

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

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

总servertid ATT exekvera 592frågor:4479毫秒

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

为什么?

你通常会想到的是,如果有N个操作来完成,每个操作需要牛逼毫秒,那么,操作的总时间应该不会超过,如果你有n个操作其中的每一个操作需要(例如)(t + 1)ms。

但无论如何,我们在这里的是日志说t>(t + 1)是真的。我很失望!那么,我不是专家,但那是不可能的:)

那么,你对此有什么想法?

这是由于一些超线程的东西?

是因为它需要更多时间在第一台服务器上产生一个新线程(这看起来像是最合理的答案)?

如果是由于线程创建问题,有什么办法可以测量这个吗?

UPDATE:

我特地深入到问题的模式出现。下面是从服务器1的一些数据(以毫秒时间):

78.125 187.5 78.125 93.75 62.5 62.5 62.5 78.125 46.875 78.125 46.875 1203.125 62.5 78.125 62.5 46.875 78.125 62.5 62.5 1484.375 62.5 62.5 1437.5 62.5 78.125

在这里是在服务器2上执行的相同的查询:

正如你可以看到,服务器1是速度快,但偶尔(如值:1203.125 ,1484.375和2500),它需要很多的时间比服务器2

所以,似乎服务器1快上一小部分的查询和服务器2更快(更平滑?)或大集的查询?

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

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

在此先感谢!

+1

几乎任何可能导致本 - I/O,其他进程...您需要的方式更好的测试,如果你真的想搞清楚。我建议你放弃它。 – 2012-02-03 22:02:52

+0

关于你的第一个时代问题;很明显,你没有显示所添加的所有内容。即使服务器2次不加总计显示;所以不可能说出你做错了什么。 – NotMe 2012-02-03 22:03:01

+0

@HenkHolterman,是的,我想我会放弃这个,因为我可能会在不久的将来转移到基于GPU的计算模型。 – Johan 2012-02-03 23:58:20

回答

4

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

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

无论如何:

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

这些物理盒子上还运行着什么?甚至还有什么在虚拟机内运行?

它可以字面上是任何东西。也许服务器1也有一个虚拟机,每隔一段时间就会运行一个计划任务,以至于耗尽资源......也许服务器1有一个完全不同的磁盘阵列,它的写入缓存跟不上需求,并且必须经常暂停冲洗?

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

问题是,没有人能够告诉你发生了什么,因为有太多的变量参与。

当我开始:

  1. 确保没有其他服务器1上运行的,除了你的虚拟机和您的应用程序。我的意思是绝对没有,没有计划的工作,没有其他的应用程序,什么都没有对于服务器2也是如此。

  2. 简介。 CPU,磁盘和内存发生了什么。服务器1是否需要将内存分页到磁盘或从磁盘分页?换句话说,它是否有足够的内存来保存你的应用程序以及它的所有数据,而不必刷新它?服务器2呢?

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

  4. 我提到过分析吗?发生暂停的地方是什么,暂停时物理硬件的状态如何。你是否在每个盒子上处理相同的数据?

  5. 决定它是否重要。这应该是第1号。毕竟,你有不同的硬件设备,你应该期待不同的性能结果。可能唯一真正重要的是Server 1有时会经历一段暂停。在这种情况下,忽略服务器2完全和配置文件服务器1.

+0

感谢您的回答!你是对的,我认为第5点是关键。我认为我必须接受(如果我没有时间深入挖掘),CPU之间的工作方式以及线程是如何在内部创建/维护/计划等方面存在个体差异的。 – Johan 2012-02-04 00:04:49