并行任务在 docker 内运行速度非常慢 - 已解决

问题描述 投票:0回答:1

我的本地笔记本电脑有 4 核和 32GB RAM。

我的 EC2 采用 c5.8xlarge - 32 核和 64GB GB。

我有一份运行一些并行进程的工作。这是一段有代表性的代码。

 Parallel.ForEach(jobList, new ParallelOptions() { MaxDegreeOfParallelism = 10 }, job=>{
    //each job includes parameters for a year to do some work for each month
    
     var subTasks = new List<Task>();
     for (var m = 1; m < 13; m++){
          var subTasks = Task.Factory.StartNew(() =>{
               //process task
               //each task include HTTP calls, SQL process, S3 csv loads and save
          });
          subTasks.Add(subTasks);
     }
     Task.WaitAll(subTasks.ToArray());
 });

当我在本地计算机上运行代码时,需要 30-40 秒。但是,我在 EC2 服务器上运行,需要超过 150 秒。我将我的项目部署为 EC2 上的 docker 容器。在我的本地,我在 IIS Express 上运行代码。

此外,我还测试了双方单任务性能内的流程。在 EC2 上,单个任务花费的时间比我本地的要少。如果一个任务在我的本地需要 10 秒,那么在 EC2 上需要 6 秒。

有谁知道出现这种差异的可能原因吗?与热身申请有关吗?

注意: 问题是一台弱的本地计算机如何能够比强的服务器快 4 倍。也就是说,我的代码在我的本地计算机上运行得很快。但在服务器中,运行速度慢了4倍。为什么?

我的本地和服务器之间有两个结构差异。 Docker + nginx 和 IIS Express。服务器容量、带宽、网络距离均优于本地。

更新:已解决

 var monthlyTasks = new List<Task>();
 using (SemaphoreSlim concurrencySemaphore = new SemaphoreSlim(150))
 {    
    foreach (var process in processList) //processList include all monthly jobs
    {
          concurrencySemaphore.Wait();
          var t = Task.Factory.StartNew(() =>
          {
               try
               {
                  RunMontlyProccess(process);
               }
               catch (Exception ex)
               {
                  _log.Error("ParallelProcess: " + process.Id + ", message:" + ex.Message, ex);
               }
               finally
               {
                   concurrencySemaphore.Release();
               }
          });
          monthlyTasks.Add(t);
    }
    Task.WaitAll(monthlyTasks.ToArray());
}

我用

Parallel. Foreach
替换了
SemaphoreSlim
。还有宾果!!!它按我的预期工作。只有14秒。这大约是一个月的流程运行时间。

我认为这与@JonasH 和@Franck 的评论有关。有些代码在不同环境下的工作方式有所不同。我不确定哪种差异会导致这种情况以及如何导致这种情况。也许是 IIS,也许是 Windows,或者是 Docker。我认为这是专家的案例。

c# multithreading docker parallel-processing
1个回答
-1
投票

你的代码与HTTP相关,也就是说它与网络连接速度(带宽)有关。与从个人计算机到 HTTP 服务器的连接相比,EC2 服务器和 HTTP 服务器之间的数据传输可能更慢。这只是一种可能!

© www.soinside.com 2019 - 2024. All rights reserved.