2012-02-03 48 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