2015-11-19 206 views
2

我每天都會在20個文件夾中運行60k +文件的文件夾,沒有子文件夾,輸入文件的大小很小。對於每個文件夾,我讀取文件,解析它將一些數據寫入一個單獨的輸出文件(即20個輸出文件)。我最近升級了我們的服務器(更高內核的更高內核&),並注意到性能急劇下降。我希望有人能指出我的問題。Parallel.ForEach在升級服務器後較慢

下面是我的代碼

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); 
    } 
}); 

過程移動到新的服務器,我注意到在performance.We急劇下降,從8個核去核36和8GB RAM容量爲128 GB RAM之後。

Server Configuration

我開始減少並行度,發現的過程表現得更好,每次我降低了並行度。

MaxDegreeOfParallelism = 2 

通過將其設置爲2我看到更高的性能。我在這裏錯過了什麼? MaxDegreeOfParallelism = Environment.ProcessorCount在運行Windows Server 2008,8 Core 8GB RAM的舊服務器上運行速度更快,而在新Windows Server 2012,32 Core 128 GB RAM上,MaxDegreeOfParallelism = 2更快。

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

  • 移交已完成,日期爲20151028.過程耗時504.05125171分鐘。
  • 截止日期20151027完成移交。過程耗時504.37106602分鐘。
  • 截止日期20151026完成交接。處理過程耗時549.76132134分鐘。
  • 截至20151025日完成交接。處理過程耗時541.97557402分鐘。
  • 截止日期20151024完成過程花費567.14474476分鐘。
  • 截止日期20151023完成。過程耗時513.51368027分鐘。
  • 截止日期20151022完成過程耗時595.21733215分鐘。

,當我使用Environment.ProcessorCount
新服務器 - 切換完成了一天20151118.The過程歷時712.05125171分鐘。

,當我使用作爲並行
程度的新的服務器 - 切換完成了一天20151118.The過程歷時89.61782427分鐘。

我會做更多的跑步和更新這個問題。

+1

聽起來就像你在窒息IO。你的磁盤怎麼樣? – spender

回答

4

處理既不是CPU也不是內存綁定,因此新服務器根本沒有任何幫助。看來IO界限了。 IO硬件是否改變?並行性加上IO很容易意味着性能降低,因爲順序IO可能會變成隨機IO。

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