Java を使用したアップロードとダウンロードのパフォーマンス チューニング

アプリケーションが Java 用 Azure Storage クライアント ライブラリを使ってデータを転送する場合、要求の速度、メモリ使用量、さらには成功または失敗に影響を与える可能性のあるいくつかの要因があります。 データ転送のパフォーマンスと信頼性を最大にするには、アプリが実行される環境に基づいて、クライアント ライブラリ転送オプションを事前に構成することが重要です。

この記事では、データ転送オプションのチューニングに関するいくつかの考慮事項について説明します。 クライアント ライブラリを適切にチューニングすると、複数の要求にデータを効率的に分散できるため、操作速度、メモリ使用量、ネットワークの安定性が向上する可能性があります。

アップロードのパフォーマンス チューニング

データ転送オプションを適切に調整することは、アップロードのパフォーマンスの信頼性の鍵となります。 ストレージ転送は、これらの引数の値に基づいて、複数のサブ転送に分割されます。 サポートされる最大転送サイズは、操作とサービスのバージョンによって異なるため、ドキュメントを調べて制限を確認してください。 Blob Storage での転送サイズの制限について詳しくは、「BLOB ストレージのスケール ターゲット」をご覧ください。

アップロードの転送オプションを設定する

ParallelTransferOptions で値を構成し、データ転送操作のパフォーマンスを向上させることができます。 次の値は、アプリのニーズに基づいてアップロード用に調整できます。

  • maxSingleUploadSize: 1 回の要求のアップロードの最大 BLOB サイズ (バイト単位)。
  • blockSize: 各要求で転送する最大ブロック サイズ。
  • maxConcurrency: 1 回の並列転送の一部として、任意の時点で発行される並列要求の最大数。

Note

指定されていない場合、各データ転送オプションの既定値がクライアント ライブラリで使用されます。 通常、これらの既定値は、データ センター環境でのパフォーマンスは優れていますが、ホーム コンシューマー環境には適していない可能性があります。 データ転送オプションの調整が不十分な場合、処理時間が非常に長くなる可能性があり、要求がタイムアウトすることさえあります。 これらの値を事前にテストし、アプリケーションと環境のニーズに基づいて調整することをお勧めします。

maxSingleUploadSize

maxSingleUploadSize 値は、1 回の要求のアップロードの最大 BLOB サイズ (バイト単位) です。 この値は、次のメソッドを使用して設定できます。

データ サイズが maxSingleUploadSize 以下 の場合、BLOB は 1 つの Put Blob 要求でアップロードされます。 BLOB サイズが maxSingleUploadSize より大きい場合、または BLOB サイズが不明な場合、BLOB は一連の Put Block 呼び出しの後に Put Block List を使用してチャンク単位でアップロードされます。

blockSize で指定する値により、maxSingleUploadSize に対して定義する値は "制限されない" ことに注意してください。 maxSingleUploadSize 引数では、操作全体をサブ転送なしで一度に実行するための、1 つの要求の個別のサイズ制限を定義します。 多くの場合、maxSingleUploadSize は、blockSize に対して定義した値より大きくはないにしても、"少なくとも" それと同じ大きさにする必要があります。 データ転送のサイズによっては、このようにすると、転送が 1 つの要求で完了し、複数の要求のオーバーヘッドが回避されるため、パフォーマンスが向上する可能性があります。

状況に最適な値がわからない場合は、blockSize に使われているのと同じ値に maxSingleUploadSize を設定するのが安全なオプションです。

blockSize

blockSize 値は、ブロック BLOB をチャンク単位でアップロードするときの転送の最大長 (バイト単位) です。 この値は、次のメソッドを使用して設定できます。

blockSize 値は、ブロック BLOB をチャンク単位でアップロードするときの転送の最大長 (バイト単位) です。 前に説明したように、この値によって maxSingleUploadSize が制限されることは "なく"、blockSize より大きくできます。

データ移動の効率性を維持するため、クライアント ライブラリではすべての転送で blockSize 値に常に達するとは限りません。 転送サイズでサポートされる最大値は、操作によって異なる場合があります。 Blob Storage での転送サイズの制限について詳しくは、「BLOB ストレージのスケール ターゲット」の表をご覧ください。

maxConcurrency

maxConcurrency 値は、1 回の並列転送の一部として、任意の時点で発行される並列要求の最大数です。 この値は、次のメソッドを使用して設定できます。

コードの例

アップロードに ParallelTransferOptions を使用する場合、次の import ディレクティブがあることを確認します。

import com.azure.storage.blob.models.*;

次のコード例は、ParallelTransferOptions の値を設定し、そのオプションを BlobUploadFromFileOptions インスタンスの一部として含める方法を示しています。 ファイルからアップロードしない場合は、BlobParallelUploadOptions を使用して同様のオプションを設定できます。 このサンプルで提供される値は、推奨を意図したものではありません。 これらの値を適切にチューニングするには、アプリの特定のニーズを考慮する必要があります。

ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions()
        .setBlockSizeLong((long) (4 * 1024 * 1024)) // 4 MiB block size
        .setMaxConcurrency(2)
        .setMaxSingleUploadSizeLong((long) 8 * 1024 * 1024); // 8 MiB max size for single request upload

BlobUploadFromFileOptions options = new BlobUploadFromFileOptions("<localFilePath>");
options.setParallelTransferOptions(parallelTransferOptions);

Response<BlockBlobItem> blockBlob = blobClient.uploadFromFileWithResponse(options, null, null);

この例では、setMaxConcurrency メソッドを使って、並列転送ワーカーの最大数を 2 に設定しています。 また、setMaxSingleUploadSizeLong メソッドを使って、maxSingleUploadSize を 8 MiB に設定しています。 BLOB のサイズが 8 MiB 未満の場合、アップロード操作を完了するために必要な要求は 1 つだけです。 BLOB サイズが 8 MiB を超える場合、setBlockSizeLong メソッドを使用して設定された最大チャンク サイズ 4 MiB のチャンク単位で BLOB がアップロードされます。

アップロードのパフォーマンスに関する考慮事項

アップロード時に、Storage クライアント ライブラリは、ParallelTransferOptions に定義された構成オプションに基づいて、特定のアップロード ストリームを複数のサブアップロードに分割します。 REST 操作は、サブアップロードごとに専用の呼び出しで行われます。 BlobClient オブジェクトの場合、この操作は Put Block です。 ストレージ クライアント ライブラリによって、これらの REST 操作が (転送オプションに応じて) 並列に管理されて、完全なアップロードが実行されます。

Note

ブロック BLOB の最大ブロック数は 50,000 ブロックです。 したがって、ブロック BLOB の最大サイズは block_size の 50,000 倍です。

アップロードの間のバッファーリング

Storage REST レイヤーでは、中断した REST アップロード操作の取得はサポートされていません。転送ごとに完了するか、失われます。 ストリーム アップロードの回復性を確保するため、ストレージ クライアント ライブラリは、アップロードを始める前に、個々の REST 呼び出しごとにデータをバッファーに格納します。 ネットワーク速度の制限だけでなく、このバッファーリング動作も、順番にアップロードする場合であっても、blockSize の値を小さくすることを検討すべき理由です。 blockSize の値を小さくすると、各要求および失敗した要求の各再試行でバッファーに格納されるデータの最大量が減ります。 あるサイズのデータ転送中にタイムアウトが頻繁に発生する場合は、blockSize の値を小さくすると、バッファーリング時間が短縮され、パフォーマンスが向上する可能性があります。

ダウンロードのパフォーマンス チューニング

データ転送オプションを適切に調整することは、ダウンロードのパフォーマンスの信頼性の鍵となります。 ストレージ転送は、ParallelTransferOptions で定義された値に基づいて、複数のサブ転送に分割されます。

ダウンロードの転送オプションを設定する

次の値は、アプリのニーズに基づいてダウンロード用に調整できます。

  • blockSize: 各要求で転送する最大ブロック サイズ。 この値は、setBlockSizeLong メソッドを使用して設定できます。
  • maxConcurrency: 1 回の並列転送の一部として、任意の時点で発行される並列要求の最大数。 この値は、setMaxConcurrency メソッドを使用して設定できます。

コードの例

ダウンロードに ParallelTransferOptions を使用する場合、次の import ディレクティブがあることを確認します。

import com.azure.storage.common.*;

次のコード例は、ParallelTransferOptions の値を設定し、そのオプションを BlobDownloadToFileOptions インスタンスの一部として含める方法を示しています。

ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions()
        .setBlockSizeLong((long) (4 * 1024 * 1024)) // 4 MiB block size
        .setMaxConcurrency(2);

BlobDownloadToFileOptions options = new BlobDownloadToFileOptions("<localFilePath>");
options.setParallelTransferOptions(parallelTransferOptions);

blobClient.downloadToFileWithResponse(options, null, null);

ダウンロードのパフォーマンスに関する考慮事項

ダウンロード時に、Storage クライアント ライブラリは、ParallelTransferOptions に定義された構成オプションに基づいて、特定のダウンロード要求を複数のサブダウンロードに分割します。 REST 操作は、サブダウンロードごとに専用の呼び出しで行われます。 転送オプションに応じて、クライアント ライブラリにより、これらの REST 操作が並列に管理されて、完全なダウンロードが実行されます。

次のステップ