我每天都會在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之後。
我開始減少並行度,發現的過程表現得更好,每次我降低了並行度。
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分鐘。
我會做更多的跑步和更新這個問題。
聽起來就像你在窒息IO。你的磁盤怎麼樣? – spender