3

使用非常基本的代码循环通过我的存储帐户并将所有容器和 blob 镜像到我的本地磁盘,我发现Get-AsureStorageBlobContent cmdlet 非常慢?无论 blob 大小如何,每个 blob 似乎都需要一两秒的实时时间……当我们有数千个小文件时,这会增加相当大的开销。

相比之下,在同一台机器和网络连接(甚至同时运行)上,Azure Explorer 执行相同的批量复制速度快 10 到 20 倍,而 AzCopy 执行速度实际上快 100 倍(异步),因此显然这不是网络问题。

是否有更有效的方式来使用 Azure 存储 cmdlet,或者它们天生就慢?Get-AzureStorageContainer的帮助提到了一个-ConcurrentTaskCount选项,它暗示了一些异步的能力,但是没有关于如何实现异步的文档,并且鉴于它只对单个项目进行操作,我不确定它是如何做到的?

这是我正在运行的代码:

$localContent       = "C:\local_copy"
$storageAccountName = "myblobaccount"
$storageAccountKey  = "mykey"

Import-Module Azure    

$blob_account = New-AzureStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey -Protocol https

Get-AzureStorageContainer -Context $blob_account | ForEach-Object {
    $container = $_.Name

    Get-AzureStorageBlob -Container $container -Context $blob_account | ForEach-Object {
        $local_path = "$localContent\{0}\{1}" -f$container,$_.Name

        $local_dir = Split-Path $local_path
        if (!(Test-Path $local_dir)) {
            New-Item -Path $local_dir -ItemType directory -Force
        }
        Get-AzureStorageBlobContent -Context $blob_account -Container $container -Blob $_.Name -Destination $local_path -Force | Out-Null
    }
}
4

2 回答 2

2

我查看了Get-AzureStorageBlobContentGithub 上的源代码,发现了一些有趣的东西,它们可能会导致下载 blob(尤其是较小的 blob)缓慢:

第 165 行:

ICloudBlob blob = Channel.GetBlobReferenceFromServer(container, blobName, accessCondition, requestOptions, OperationContext);

这段代码所做的是它向服务器发出请求以获取 blob 类型。因此,您为每个 blob 添加一个额外的请求到服务器。

第 252 - 262 行:

        try
        {
            DownloadBlob(blob, filePath);

            Channel.FetchBlobAttributes(blob, accessCondition, requestOptions, OperationContext);
        }
        catch (Exception e)
        {
            WriteDebugLog(String.Format(Resources.DownloadBlobFailed, blob.Name, blob.Container.Name, filePath, e.Message));
            throw;
        }

如果您查看上面的代码,它首先会下载 blobDownloadBlob并尝试获取 blob 属性Channel.FetchBlobAttributes。我没有查看Channel.FetchBlobAttributes函数的源代码,但我怀疑它正在向服务器发出另一个请求。

因此,要下载单个 blob,本质上代码是向服务器发出 3 个请求,这可能是速度缓慢的原因。可以肯定的是,您可以通过 Fiddler 跟踪您的请求/响应,并查看 cmdlet 与存储交互的准确程度。

于 2013-08-13T06:06:57.743 回答
0

查看Blob 传输实用程序。它使用 Azure api,它也是 Azure Explorer 使用的一个不错的选择。BTU 是开源的,因此测试它是否是问题所在的 cmdlet 会容易得多。

于 2013-08-12T22:18:10.650 回答