Start-AzureStorageBlobCopy 与 AzCopy:哪个花费的时间更少

Start-AzureStorageBlobCopy vs AzCopy: which one takes lesser time

我需要将 vhd 从一个订阅移动到另一个订阅。我想知道哪个是更好的选择:Start-AzureStorageBlobCopyAzCopy?

哪一个花费的时间更少?

他们都将花费相同的时间,因为他们所做的只是启动 Async Server-Side Blob Copy。它们只是告诉服务开始将 blob 从源复制到目标。实际的复制操作由 Azure Blob 存储服务执行。复制 blob 所需的时间取决于许多因素,包括但不限于:

  • 来源和目的地位置。
  • 源 blob 的大小。
  • 加载存储服务。

运行 未指定选项 /SyncCopy 的 AzCopy 和 运行ning PowerShell 命令 Start-AzureStorageBlobCopy 的持续时间应该相同,因为它们都使用服务器端异步复制。

如果您想跨区域复制 blob,最好考虑在执行 AzCopy 时指定选项 /SyncCopy 以获得一致的速度,因为数据的异步复制将 运行据说您可能会在“复制”操作中看到不一致的服务器背景。

如果指定了/SyncCopy 选项,AzCopy 会先将内容下载到内存,然后再将内容上传回Azure 存储。为了获得更好的/SyncCopy 性能,您应该在区域与源存储帐户相同的VM 中运行 AzCopy。除此之外,VM 大小(决定带宽和 CPU 核心数)也可能会影响复制性能。

详情请参考Getting Started with the AzCopy Command-Line Utility

他们花的时间不一样。

我试过从一个账户复制到另一个账户,结果差别很大。

Start-AzureStorageBlobCopy -SrcBlob $_.Name -SrcContainer $Container -Context $ContextSrc -DestContainer $Container -DestBlob $_.Name -DestContext $ContextDst --Verbose

这大约需要 2.5 小时。

& .\AzCopy.exe /Source:https://$StorageAccountNameSrc.blob.core.windows.net/$Container /Dest:https://$StorageAccountNameDst.blob.core.windows.net/$Container /SourceKey:$StorageAccountKeySrc /DestKey:$StorageAccountKeyDst /S

这需要几分钟时间。

我这里有大约 600 Mb 和大约 7000 个文件。

Elapsed time:            00.00:03:41
Finished 44 of total 44 file(s).
[2017/06/22 17:05:35] Transfer summary:
-----------------
Total files transferred: 44
Transfer successfully:   44
Transfer skipped:        0
Transfer failed:         0
Elapsed time:            00.00:00:08
Finished 345 of total 345 file(s).
[2017/06/22 17:06:07] Transfer summary:
-----------------
Total files transferred: 345
Transfer successfully:   345
Transfer skipped:        0
Transfer failed:         0
Elapsed time:            00.00:00:31

有谁知道为什么会如此不同?

AzCopy 提供异步复制服务所缺乏的 SLA。 AzCopy 旨在实现最佳性能。使用 the/SyncCopy 参数以获得一致的复制速度。

在大多数情况下,AzCopy 可能比 Start-AzureStorageBlobCopy 更快,因为您启动复制的方式会减少对 Azure 的调用 API:

  • [AzCopy]1 次调用整个容器(不考虑 blob 计数)

  • [Start-AzureStorageBlobCopy] 由于容器中的 blob 数量,调用了 N 次。

最初我认为这与两者似乎在 Azure 端触发相同的异步副本相同,但是在客户端这将直接可见,正如@Evgeniy 在他的回答中所发现的那样。

在容器场景中的 1 blob 中,理论上两个命令将同时完成。

*编辑(可能的解决方法): 我能够通过以下方式极大地减少我的时间:

  1. 删除控制台输出和
  2. 使用 -ConcurrentTaskCount 开关,在我的例子中设置为 100。现在将其缩短到 5 分钟以下。