2011-09-29 75 views
8

我有一個長時間運行的進程,它讀取大文件並寫入摘要文件。爲了加快速度,我在處理多個文件同時使用普通的舊主題:.NET中的線程vs進程

ThreadStart ts = new ThreadStart(Work); 
Thread t = new Thread(ts); 
t.Start(); 

什麼我發現是,即使單獨的線程讀取不同的文件,並將它們之間沒有鎖定和使用上的24 4個線程核心框,我甚至不能在CPU上達到10%或在磁盤I/O上達到10%。如果我在我的應用中使用更多的線程,它似乎運行得更慢。

我想我做錯了什麼,但是好奇的是,如果我第二次和第三次啓動整個exe,那麼它實際上處理文件的速度要快兩到三倍。我的問題是,爲什麼我不能在我的一個應用程序中獲得12個線程來處理數據併爲機器徵稅,以及在我的應用程序的3個實例中有4個線程?

我已經介紹了應用程序,最耗時間和頻繁調用的函數都是字符串處理調用。

+6

不可能說沒有實際的代碼做文件處理。 –

+5

配置文件運行過程中告訴你瓶頸在哪裏? –

+0

應該有一些帶有鎖定/同步代碼的公共位置(可以通過處理線程訪問),您可以共享此同步代碼 – sll

回答

-1

嘗試使用.net 4(System.Threading.Task)的任務庫。該庫對不同數量的處理器具有內置優化。

不知道什麼是你的問題,也許是因爲您的代碼段是不是真的翔實

+0

使用任務庫不會解決他的問題,他已經在使用線程,當你深入挖掘的時候就是Task將要使用的線程。 –

+0

感謝您的信息,capt。我的意思是說任務庫有調度和線程數優化。這與你使用粗線程不一樣。祝你有個美好的一天 –

6

這可能是因爲您的計算問題不是CPU的約束,但是I/O瓶頸。它無助於聲明您的磁盤I/O「僅在10%」。我不確定這樣的表現櫃檯是否存在。

使用更多線程時速度變慢的原因是因爲這些線程都試圖同時訪問它們各自的文件,而磁盤子系統卻很難適應所有不同的線程。即使採用像SSD這樣的現代技術,尋找時間比傳統硬盤要小几個數量級,您仍然會看到一個懲罰。

相反,您應該得出結論:您的問題是磁盤綁定,並且單個線程可能是解決問題的最快方法。

有人可能會爭辯說,您可以使用異步技術來處理已讀取的內容,而在後臺讀取下一部分內容,但我認爲您會看到很少的性能改進。

不久前我有一個類似的問題,在一個小工具中,我想計算我的硬盤上所有文件的MD5簽名,並且發現CPU與存儲系統相比太快了,而我試圖通過使用更多線程獲得更多性能的結果相似。

使用任務並行庫並沒有緩解這個問題。

+1

我同意你的意見,但我不明白爲什麼如果磁盤I/O出現問題,我可以使用多個可執行文件更快地處理文件,而不是使用更多線程的單個exe文件。我覺得我可能做錯了什麼,但是我不知道什麼是每個線程獨立運行。 – powlette

+0

當你對所閱讀的東西沒有做任何事情時,你的過程是否會加快速度?也許你應該禁用它並檢查結果。我在猜測你正在做的處理的一部分鎖定了問題,即使你還沒有真正看到它。 –

+0

快多快?我們在談論單位還是雙位數的業績增長? –

2

首先在24核心盒上,如果只使用4個線程,那麼它可以使用的CPU數量最多爲16.7%,所以真正獲得60%的利用率,這是相當不錯的。

很難判斷你的程序是否在此時被I/O綁定,我的猜測就是這樣。您需要在您的項目上運行一個分析器,並查看您的項目花費大部分時間的代碼段。如果它坐在讀/寫操作上,則它是I/O限制的。

您可能會使用某種形式的線程間鎖定。這會導致程序在添加更多線程時變慢,並且運行第二個進程會解決這個問題,但修復鎖定也是如此。

這些都歸結爲沒有分析信息,我們不能說如果使用第二個進程會加快速度或使速度變慢,我們需要知道該程序是否掛在I/O操作上,鎖定操作,或者花費很長時間才能實現更好的並行化功能。

+1

這是一個很好的例子 - 看起來海報在第一水平的數學和其他人都不好。這裏是解釋:一個線程只能在一個核心上運行。永遠。無法同時在2個內核上工作。因此,100%使用24個內核......使用os 4/24 = 16.7的最高級別(對操作系統來說稍微多一點)。在身體上不可能獲得更多。想要100%?移動到4核心機器。 – TomTom

+0

@TomTom正如你可以在問題中看到的那樣,在4個線程之後,應用程序實際上*失去*性能。另外,在我的4核心機器中,當我在一些密集型任務中放置2個以上的線程時,會遇到同樣的問題。對我來說很明顯,一個應用程序有一個由操作系統分配的最大時間片,它的所有線程必須共享這個時間片。 – ThunderGr

+0

@ThunderGr每個線程都有它自己的時間片,這就是線程的要點。一個單核機器可以運行一個併發時間片,一個雙核可以運行兩個併發時間片等等。海報的問題是,CPU處理能力不是他的問題,他的程序正在等待磁盤上的任何一個返回一些IO或一些有鎖的資源被釋放。添加更多線程會增加他的程序運行不足的缺點,並使其運行速度更慢*** –

0

我想你會發現什麼文件緩存是不理想的情況下,當一個進程同時寫入多個文件中的數據。當髒頁緩存的數量超過閾值時,文件緩存應該同步到磁盤。似乎一個進程中的併發編寫者比單線程編寫者的命中速度更快。你可以在這裏閱讀有關文件系統緩存的內容File Cache Performance and Tuning