繁体   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