我有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更快(更平滑?)或大集的查询?
可以从这些数字得出任何结论吗?
为什么我们看到这些差异?
在此先感谢!
几乎任何可能导致本 - I/O,其他进程...您需要的方式更好的测试,如果你真的想搞清楚。我建议你放弃它。 – 2012-02-03 22:02:52
关于你的第一个时代问题;很明显,你没有显示所添加的所有内容。即使服务器2次不加总计显示;所以不可能说出你做错了什么。 – NotMe 2012-02-03 22:03:01
@HenkHolterman,是的,我想我会放弃这个,因为我可能会在不久的将来转移到基于GPU的计算模型。 – Johan 2012-02-03 23:58:20