簡體   English   中英

升級服務器后Parallel.ForEach變慢

[英]Parallel.ForEach slower after upgrading server

我的日常工作是在20個文件夾中運行,其中有60k +個文件。沒有子文件夾,輸入文件只有幾MB大小。對於每個文件夾,我都會讀取文件,對其進行解析並將一些數據寫入單獨的輸出文件中(即20個輸出文件)。我最近升級了服務器(更高的內核和更高的內存),並注意到性能急劇下降。希望有人可以向我指出問題。

下面是我的代碼

int iFolderCount = 0;
DirectoryInfo oSourceFolder = new DirectoryInfo(sInputFolder);
DirectoryInfo[] oIdDirectoryList = oSourceFolder.GetDirectories().Where(Id => sFolderList.Contains(Id.Name.ToUpper())).ToArray<DirectoryInfo>();
Parallel.ForEach(oIdDirectoryList, new ParallelOptions { MaxDegreeOfParallelism =  Environment.ProcessorCount }, (oId, state) =>
{
     FileInfo[] sFileList = oId.GetFiles();
     RawCounter.GetOrAdd(oId.Name.ToUpper(), sFileList.Length);

     using (StreamWriter oHandoffWriter = new StreamWriter(new FileStream(string.Format("{0}{1}_{2}_{3}{4}", sOutputFolder, Day, sOutputFileName, Interlocked.Increment(ref iFolderCount), HANDOFF_FILE_EXTENSION),FileMode.Append,FileAccess.Write,FileShare.Write)))
     {
         int iFileCounter = 0;
         foreach (FileInfo oFileInfo in sFileList)
         {
             try
             {
                 ProcessFile(oFileInfo, oHandoffWriter);
                 iFileCounter++;
             }
             catch (Exception ex)
             {
                 oLog.Info("Failed to process file " + oFileInfo.Name);
                 oLog.Info(ex.Message);
                 oLog.Info(ex.StackTrace);
                 oLog.Info(ex.InnerException);
                 File.Copy(oFileInfo.FullName, sErrorFileFolderPath + oFileInfo.Name, true);
             }
         }
         ProcessedCounter.GetOrAdd(oId.Name.ToUpper(), iFileCounter);
    }
});

將過程轉移到新服務器后,我發現性能急劇下降,我們從8核變為36核,從8GB RAM變為128GB RAM。

服務器配置

我開始降低並行度,並注意到每次降低並行度時,該過程的性能都會更好。

MaxDegreeOfParallelism =  2

通過將其設置為2,我看到了更高的性能。我在這里缺少什么? 在運行Windows Server 2008、8 Core,8GB RAM的舊服務器上,MaxDegreeOfParallelism = Environment.ProcessorCount更快,而在新的Windows Server 2012、32Core,128 GB RAM上,MaxDegreeOfParallelism = 2更快。

編輯 :我同意該過程是IO密集型。每日文件計數/大小不會有太大變化。 以下是舊服務器上該過程的完整時間。

  • 到20151028天的移交已完成,該過程耗時504.05125171分鍾。
  • 到20151027日完成交接,整個過程耗時504.37106602分鍾。
  • 到20151026天的越區切換完成。整個過程耗時549.76132134分鍾。
  • 到20151025日完成交接,整個過程耗時541.97557402分鍾。
  • 移交已完成,日期為20151024,該過程耗時567.14474476分鍾。
  • 到20151023天的切換完成,過程耗時513.51368027分鍾。
  • 到2015年10月21日的交接完成。該過程耗時595.21733215分鍾。

在使用Environment.ProcessorCount的新服務器上
-到20151118天完成交接,整個過程耗時712.05125171分鍾。

在新服務器上,當我使用2作為並行度時
-到20151118天完成交接,整個過程耗時89.61782427分鍾。

我將進行更多運行並更新此問題。

該處理不受CPU或內存的限制,因此新服務器根本無濟於事。 似乎IO受限。 IO硬件是否發生了變化? 並行加IO很容易意味着性能降低,因為順序IO可能會變成隨機IO。

根據CPU內核數選擇用於IO的DOP是錯誤的。 最佳IO DOP與內核數無關。 根據經驗確定最佳DOP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM