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 操作が並列に管理されて、完全なダウンロードが実行されます。
次のステップ
- この記事は、Java の Blob Storage 開発者ガイドの一部です。 開発者ガイドの記事の完全な一覧については、「アプリケーションをビルドする」を参照してください。
- Azure Storage の操作のパフォーマンスに影響を与える可能性のある要因について詳しくは、「Blob Storage での待ち時間」をご覧ください。
- Blob Storage を使用するアプリのパフォーマンスを最適にするための設計に関する考慮事項の一覧については、「BLOB ストレージのパフォーマンスとスケーラビリティのチェックリスト」をご覧ください。