【问题标题】:Why would Task parallelism not speed up uploads / downloads?为什么任务并行性不会加快上传/下载速度?
【发布时间】:2019-01-25 23:07:32
【问题描述】:

我编写了一个简单的 C# 控制台应用程序来测量按顺序和并行下载 20 个 Azure blob 文件(每个大约 3mb 的图像)的速度。

我的印象是并行下载文件会明显更快,但根据我的经验,它实际上需要更长的时间。以下是并行下载的代码:

    List<Task> tasks = new List<Task>();
    foreach (string blobName in blobNames)
    {
        Task t = Task.Run(() =>
        {
            CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
            blockBlob.DownloadToFileAsync(blobName, FileMode.Create).Wait();
        });

        tasks.Add(t);
    }

    Task.WaitAll(tasks.ToArray());

我是不是在处理这个错误,导致不必要的瓶颈或其他什么?还是我从根本上误解了并行的好处?

【问题讨论】:

  • 不完整,您需要指定结果时间和可用带宽。没有它只是猜测。

标签: c# azure async-await task-parallel-library azure-blob-storage


【解决方案1】:

IMO,您不应为下载每个 blob 启动新任务,因为这是 I/O 密集型操作,而不是计算密集型操作。 使用多个任务会增加管理任务的开销,而实际上您并没有获得任何收益。

将您的代码更改为:

List<Task> tasks = new List<Task>();
foreach (string blobName in blobNames)
{
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
    tasks.Add(blockBlob.DownloadToFileAsync(blobName, FileMode.Create));
}


Task.WaitAll(tasks.ToArray());

这将启动多个异步 I/O 请求,并且在从 Azure blob-storage 下载所有 blob 后,您的代码将继续运行。 由于我们没有单独等待每个下载任务,所有下载都同时运行。

【讨论】:

  • 谢谢,这速度非常快!不过,我想澄清一下:我知道我通过消除“包装”任务减少了任务数量,但 DownloadToFileAsync 仍在创建任务,因此仍有 20 个任务在运行,对吧?
  • Task.Run 最有可能使用线程池,并且对于它将运行多少并发任务/线程有上限。
  • 好的,很有趣。作为更新,我注意到使用相同策略的上传速度并没有真正提高很多——也许只是一点点。不过,下载似乎好多了。
  • @vargonian - 如果您的所有请求都发送到同一主机 - 因为它很可能是 Azure blob 存储 - 您也可能会遇到只有 2 个的 maximum concurrent requests per host,如果您可以更改有带宽支持更多。 (这假设CloudBlockBlob 在下面某处使用ServicePoint,这很可能)。
  • @vargonian :是的,您正在使用此代码同时运行许多“任务”。但是,您没有浪费任何线程,因为您没有启动任何(TPL)任务。相反,您正在启动 I/O 操作,并且您将等到 I/O 操作完成。与此同时,你可以做其他事情。这是了解更多背景信息的好书:blog.stephencleary.com/2013/11/there-is-no-thread.html
【解决方案2】:

我的印象是并行下载文件会明显更快,但根据我的经验,它实际上需要更长的时间。以下是并行下载的代码:

IO 操作的性能取决于很多因素。

只有在并非所有节点都已达到最大性能的情况下,您才能使用并行化来加速。

例如,如果以下条件之一适用,您将不会受益,并且整体性能可能会因开销而降级:

专门用于下载:

  • 您正在达到网络、LAN 或 Internet、WAN 的下载/上传容量
  • 您正在达到最大处理能力(磁盘、内存等)
  • 您正在达到远程服务器的最大上传容量(注意:可以绑定 IP,尤其是云提供商)

【讨论】:

  • 谢谢@Stefan,例如,我正在考虑这些,但不认为我限制了我的带宽。我对第二个要点知之甚少,但与我通常做的事情相比,我的任务似乎并不太密集。所以真正让我感到疑惑的是第 3 点,也就是说,如果 Azure 服务器以某种方式限制了我,可能会按照你的建议绑定到我的 IP。
  • 如果是,它在订阅条件中的某个地方。这在很大程度上取决于您拥有哪种订阅。不过,请记住,通常 Azure 能够为您提供的数据多于您的进度。所以,通常我会先检查你自己的基础设施;例如:执行典型的速度测试,看看是否没有任何瓶颈,例如 Wifi 或类似的东西 ;-)
猜你喜欢
  • 1970-01-01
  • 2012-08-06
  • 2015-12-05
  • 1970-01-01
  • 2015-10-15
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多