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

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

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

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

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

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

BlockBlobParallelUploadOptions でプロパティを構成し、データ転送操作のパフォーマンスを向上させることができます。 次の表に、構成できるプロパティと説明を示します。

プロパティ 説明
blockSize アップロード操作の一部として、要求ごとに転送する最大ブロック サイズ。 詳細については、「blockSize」を参照してください。
maxSingleShotSize データのサイズがこの値以下の場合は、チャンクに分割されるのではなく、1 つの put でアップロードされます。 データが 1 回のショットでアップロードされた場合、ブロック サイズは無視されます。 既定値は 256 MB です。 このプロパティをカスタマイズする場合は、256 MB 以下の値を使用する必要があります。 詳細については、「maxSingleShotSize」を参照してください。
concurrency 1 回の並列転送の一部として、任意の時点で発行される並列要求の最大数。

Note

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

maxSingleShotSize

maxSingleShotSize 値は、1 回の要求のアップロードの最大 BLOB サイズ (バイト単位) です。

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

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

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

blockSize

blockSize 値は、ブロック BLOB をチャンク単位でアップロードするときの転送の最大長 (バイト単位) です。

前に説明したように、この値によって maxSingleShotSize が制限されることは "なく"、blockSize より大きくできます。

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

コードの例

次のコード例は、BlockBlobParallelUploadOptions に値を設定し、そのオプションをアップロードメソッド呼び出しの一部として含める方法を示しています。 このサンプルで使用した値は、推奨を意図したものではありません。 これらの値を適切にチューニングするには、アプリの特定のニーズを考慮する必要があります。

// Specify data transfer options
const uploadOptions = {
  blockSize: 4 * 1024 * 1024, // 4 MiB max block size
  concurrency: 2, // maximum number of parallel transfer workers
  maxSingleShotSize: 8 * 1024 * 1024, // 8 MiB initial transfer size
} 

// Create blob client from container client
const blockBlobClient = containerClient.getBlockBlobClient(blobName);

// Upload blob with transfer options
await blockBlobClient.uploadFile(localFilePath, uploadOptions);

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

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

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

Note

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

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

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

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

ダウンロードのデータ転送オプションの調整は、downloadToBuffer メソッドを使う場合にのみ使用できます。 このメソッドでは、BlobDownloadToBufferOptions で定義されている値に基づいて、バッファーに並列で BLOB がダウンロードされます。 他のダウンロード メソッドでは、データ転送オプションの調整はサポートされていません。

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

downloadToBuffer メソッドを使用する場合、ダウンロード用に次の値を調整できます。

  • blockSize: 各要求で転送する最大ブロック サイズ。
  • concurrency: 1 回の並列転送の一部として、任意の時点で発行される並列要求の最大数。

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

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

コードの例

次のコード例は、BlobDownloadToBufferOptions の値を設定し、downloadToBuffer メソッド呼び出しの一部としてオプションを含める方法を示しています。 このサンプルで使用した値は、推奨を意図したものではありません。 これらの値を適切にチューニングするには、アプリの特定のニーズを考慮する必要があります。

// Specify data transfer options
const downloadToBufferOptions = {
    blockSize: 4 * 1024 * 1024, // 4 MiB max block size
    concurrency: 2, // maximum number of parallel transfer workers
}

// Download data to buffer
const result = await client.downloadToBuffer(offset, count, downloadToBufferOptions);