2012-06-08 110 views
2

我有一個像這樣設置的程序。它是一個.Net Framework 4控制檯應用程序。 該程序用於從每個服務器上的每個日誌文件(前一週)收集sc-bytes和cs-bytes。該程序已完成,但需要很長時間才能運行。線程是否會提高性能?

foreach (string server in servers) 
      { 

       foreach (string website in Directory.GetDirectories(server)) 
       { 

        foreach (string file in Directory.GetFiles(website)) 
        { 

我只是想知道是否可以使用線程或PLINQ來加速進程? 如果這可以提高性能,我不確定實現它的最佳方式,因爲擁有這麼多線程顯然不會提高性能,因此爲每個日誌文件(甚至每個網站)都設置一個新線程似乎不合邏輯。

如果您需要查看更多代碼,請詢問,但該程序基本上讀取在過去七天內創建的每個文件的每一行,添加字節數,然後使用目錄條目獲取網站名稱(從ID),然後將每個網站的名稱和總字節數輸出到一個文本文件中(最終將成爲數據庫)。 我不需要任何實際的代碼,只是建議最好的方法(如果可能)來提高性能。

謝謝。

+1

一個好主意可能是投資高端SSD。這肯定會改善這種情況,遠遠超過多線程處理你的應用程序 – Lakis

+0

你的代碼沒有任何意義。你如何從網站獲取文件? –

+0

對不起,也許我應該提供更多的代碼。服務器陣列中的每臺服務器看起來像... servers.Add(@「\\ 1.1.1.1 \ e $ \ logfiles」); ...他們都直接指向一個日誌文件夾,然後我使用Directory.GetFiles。 –

回答

4

在像這樣的IO綁定任務中(遍歷目錄和文件並讀取它們),瓶頸是磁盤IO,而不是CPU。

並行化(?)這不太可能有助於加速它,甚至可能會傷害性能。

+0

感謝您的快速響應。對不起,我無法投票答覆你的答案。 –

0

它確實取決於所執行的「處理」,無論使用多個併發線程是否會提高性能。很可能從你的描述中你是I/O綁定的,所以多線程不會有太大的幫助,甚至可能會變得更糟。

所以,除非你自己測量它,否則答案是一個確定的「可能」。測量是關鍵。

+0

感謝您的快速響應。對不起,我無法投票答覆你的答案。 –

1

如果服務器是不同機器上的磁盤,那麼它將提高性能,以並行化來自每個服務器的請求目錄和文件。這是一個服務器在一個線程中運行,可能有1000個服務器在10個線程中運行。您的程序將等待很多IO,網絡帶寬可能成爲瓶頸。 更好的方法是在每臺執行計數的服務器上安裝Web服務,然後詢問每個Web服務的結果。這樣網絡就不會成爲瓶頸,你甚至可以在你問他們時已經知道答案的Web服務(也許使用文件系統監視器)。

0

答案取決於幾件事情:運行客戶端程序的機器有多少個CPU,每臺服務器的日誌檢查是否正在進入每臺服務器上的日誌文件夾,或者正在檢查每臺服務器上的每個目錄(如果有的話,檢查每臺服務器上的文件系統有多大服務器),以及文件夾在可能通過Directory.GetDirectories在您的代碼片段中遞歸的內容有多深。

你說這個任務運行需要「很長時間」。在收集數據時,一些基本的Perfmon統計信息和一些TaskManager視圖可以幫助您確定CPU和磁盤在本地的使用情況,但我懷疑並不像您想象的那樣多。

如果使用.Net的System.Threading同時處理多個遠程服務器上的日誌,則很可能會發現I/O負載在多線程下跨多個服務器的I/O負載進行擴展。然後,試圖從不同服務器併發收集數據的客戶端機器上的可能瓶頸將取決於客戶端機器必須對該線程進行多處理的CPU數量以及它可以提供的網絡帶寬,以便通過網絡路徑接收各種服務器併發。

0

文件系統緩存訪問數據,如目錄特別的東西和文件信息。所以,如果你使用諸如PLINQ之類的東西,你應該能夠看到性能的輕微提升。在一個控制檯應用程序中,我並沒有真正看到這一點。如果性能和表現的看法是很重要的,這樣的事情會在進度和取消一個GUI來完成...

但是,我認爲有關於你發佈的代碼的一些問題。從網站獲取文件?這將需要通過線路連接到另一臺服務器的某種請求;我會建議操作完成異步。你還沒有提供任何人的細節來建議你如何做到這一點。

+0

我沒有從網站獲取文件,它來自服務器。每臺服務器都設有一個日誌文件夾,裏面有每個網站的文件夾。每個網站文件夾都包含日誌文件。如有必要,我可以提供更多代碼。 –

+0

您可以詳細說明服務器和網站的詳細信息......您不清楚您要做什麼;所以,可能很難給你提供建議。 –

+0

在我的代碼中提到的任何網站只是服務器上的一個目錄,而不是真正的網站。以下是服務器上日誌文件的示例路徑>> \\ 216.18.234.20 \ e $ \ logfiles \ W3SVC10 \ u_ex120603.log ...其中W3SVC10是我指的網站。它只是一個包含日誌的文件夾。 –

0

並聯纔有意義,如果幾個線程的性能比一個線程的性能更好。

實際結果取決於您擁有的硬件。

如果你有非常快速的網絡和數據存儲在固態硬盤在每次你可能會嘗試並行所有流程服務器。

上述配置在現實世界中很少見。

在常規環境中檢查您的網絡利用率。如果它低於20%你可以嘗試並聯服務器

連續讀取與HDD(沒有SSD)比較,以更快的多線程讀取嵌套循環使並聯不太可能會幫助你。

P.S.不要嘗試利用您的網絡100%。你的IT不會爲此感到高興。