3

ストレージ アカウントを単純にループし、すべてのコンテナーと BLOB をローカル ディスクにミラーリングする非常に基本的なコードを使用すると、Get-AsureStorageBlobContentコマンドレットが非常に遅いことがわかります。BLOB のサイズに関係なく、BLOB ごとにリアルタイムで 1 ~ 2 秒かかるようです。これは、何千もの小さなファイルがある場合にかなりのオーバーヘッドを追加します。

対照的に、同じマシンとネットワーク接続 (同時に実行している場合でも) では、Azure Explorer は同じ一括コピーを 10 倍から 20 倍高速に実行し、AzCopy は文字通り 100 倍高速 (非同期) に実行するため、ネットワークの問題ではないことは明らかです。

Azure Storage コマンドレットを使用するより効率的な方法はありますか?それとも、単に動作が遅いだけですか? 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

Githubのソース コードを調べたところ、Get-AzureStorageBlobContentBLOB (特に小さいサイズの BLOB) のダウンロードが遅くなる可能性がある興味深いことがわかりました。

165 行目:

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

このコードが行うことは、BLOB タイプをフェッチするようにサーバーに要求することです。したがって、ブロブごとに 1 つの追加の要求をサーバーに追加します。

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;
        }

上記のコードを見ると、最初に blob がダウンロードされ、DownloadBlobblob 属性のフェッチが試行されますChannel.FetchBlobAttributes。関数のソース コードは見ていませんがChannel.FetchBlobAttributes、サーバーに対してもう 1 つの要求を行っているのではないかと思われます。

したがって、単一のブロブをダウンロードするために、基本的にコードはサーバーに対して 3 つの要求を行っているため、速度が低下する可能性があります。確かに、Fiddler を介して要求/応答を追跡し、コマンドレットがストレージとどのように対話しているかを正確に確認できます。

于 2013-08-13T06:06:57.743 に答える
0

Blob Transfer Utilityを確認してください。これは Azure API を使用しており、Azure Explorer もこれを使用していることは間違いありません。BTU はオープン ソースであるため、コマンドレットに問題があるかどうかをテストする方がはるかに簡単です。

于 2013-08-12T22:18:10.650 に答える