JavaScript를 사용하여 업로드 및 다운로드 성능 튜닝

애플리케이션이 JavaScript용 Azure Storage 클라이언트 라이브러리를 사용하여 데이터를 전송하는 경우 속도, 메모리 사용량, 요청의 성공 또는 실패에도 영향을 줄 수 있는 몇 가지 요인이 있습니다. 데이터 전송 성능과 안정성을 극대화하려면 앱이 실행되는 환경에 따라 클라이언트 라이브러리 전송 옵션을 사전에 구성하는 것이 중요합니다.

이 문서에서는 데이터 전송 옵션을 튜닝하기 위한 몇 가지 고려 사항을 안내합니다. 제대로 조정되면 클라이언트 라이브러리는 여러 요청에 데이터를 효율적으로 분산할 수 있으므로 작업 속도, 메모리 사용량, 네트워크 안정성이 향상될 수 있습니다.

업로드에 대한 성능 튜닝

데이터 전송 옵션을 올바르게 튜닝하는 것은 안정적인 업로드 성능의 핵심입니다. 스토리지 전송은 이러한 인수 값에 따라 여러 하위 전송으로 분할됩니다. 지원되는 최대 전송 크기는 작업 및 서비스 버전에 따라 다르므로 설명서를 확인하여 한도를 결정해야 합니다. Blob 스토리지 전송 크기 제한에 대한 자세한 내용은 Blob 스토리지의 스케일링 대상을 참조하세요.

업로드를 위한 전송 옵션 설정

BlockBlobParallelUploadOptions에서 속성을 구성하여 데이터 전송 작업에 대한 성능을 향상시킬 수 있습니다. 다음 표에서는 구성할 수 있는 속성과 설명을 나열합니다.

속성 설명
blockSize 업로드 작업의 일부로 각 요청에 대해 전송할 최대 블록 크기. 자세한 내용은 blockSize을 참조하세요.
maxSingleShotSize 데이터 크기가 이 값보다 작거나 같으면 청크로 나뉘지 않고 단일 배치로 업로드됩니다. 단일 실행에서 데이터를 업로드하면 블록 크기가 무시됩니다. 기본값은 256MB입니다. 이 속성을 사용자 지정하는 경우 256MB보다 작거나 같은 값을 사용해야 합니다. 자세한 내용은 maxSingleShotSize를 참조하세요.
concurrency 단일 병렬 전송의 일부로 지정된 시간에 발급되는 최대 병렬 요청 수.

참고

클라이언트 라이브러리는 각 데이터 전송 옵션에 대해 기본값을 사용합니다(제공하지 않는 경우). 이러한 기본값은 일반적으로 데이터 센터 환경에서 수행되지만 일반 소비자 환경에는 적합하지 않을 수 있습니다. 데이터 전송이 제대로 튜닝되지 않으면 작업이 지나치게 오래 걸리고 요청 시간 제한도 발생할 수 있습니다. 이러한 값을 테스트하고 애플리케이션 및 환경 요구 사항에 따라 튜닝하는 것이 가장 좋습니다.

maxSingleShotSize

maxSingleShotSize 값은 단일 요청 업로드에 대한 최대 Blob 크기(바이트)입니다.

데이터 크기가 maxSingleShotSize보다 작거나 같은 경우 Blob은 단일 Blob 배치 요청으로 업로드됩니다. blob 크기가 maxSingleShotSize보다 크거나 blob 크기를 알 수 없는 경우, blob은 일련의 Put Block 호출 후 Put Block List를 사용하여 여러 청크로 나뉘어 업로드됩니다.

blockSize에 지정한 값이 에 정의한 값을 제한하지 maxSingleShotSize 점을 유의해야 합니다. maxSingleShotSize 인수는 요청이 전체 작업을 한 번에 수행하도록 하위 전송 없이 별도의 크기 제한을 정의합니다. maxSingleShotSize적어도blockSize에 대해 정의한 값만큼 크도록 하려는 경우가 많습니다(더 크지 않은 경우). 데이터 전송 크기에 따라 단일 요청으로 전송이 완료되고 여러 요청의 오버헤드를 방지하므로 이 방법은 더 우수한 성능을 발휘할 수 있습니다.

상황에 가장 적합한 값이 무엇인지 잘 모르는 경우 안전한 옵션은 maxSingleShotSizeblockSize에 사용되는 값과 동일한 값으로 설정하는 것입니다.

blockSize

blockSize 값은 블록 Blob을 청크로 업로드할 때 최대 전송 길이(바이트)입니다.

앞에서 설명한 것처럼 이 값은 보다 클 수 있는 maxSingleShotSize를 제한하지 않습니다.blockSize

데이터를 효율적으로 이동하기 위해 클라이언트 라이브러리는 모든 전송에 대한 blockSize 값에 항상 도달하지 않을 수 있습니다. 작업에 따라 전송 크기에 지원되는 최대 값이 다를 수 있습니다. Blob 스토리지 전송 크기 제한에 대한 자세한 내용은 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(을)를 8MiB로 설정합니다. Blob 크기가 8MiB보다 작은 경우 작업을 완료하려면 단일 요청만 필요합니다. Blob 크기가 8MiB보다 큰 경우 blob은 최대 청크 크기가 4MiB인 청크로 업로드되며 blockSize 속성에서 정의합니다.

업로드 성능 고려 사항

업로드하는 동안 Storage 클라이언트 라이브러리는 지정된 업로드 스트림을 BlockBlobParallelUploadOptions에서 정의한 구성 옵션에 따라 지정된 여러 하위 업로드로 분할합니다. 각 하위 업로드에는 REST 작업에 대한 자체 전용 호출이 있습니다. 이 예제에서 작업은 Put Block입니다. Storage 클라이언트 라이브러리는 전송 옵션에 따라 이러한 REST 작업을 병렬로 관리하여 전체 업로드를 완료합니다.

참고

블록 Blob의 최대 블록 수는 50,000개입니다. 따라서 블록 Blob의 최대 크기는 block_size 크기의 50,000배입니다.

업로드 중 버퍼링

Storage REST 계층은 중단된 REST 업로드 작업을 중단한 지점부터 다시 이어서 수행하는 기능을 지원하지 않습니다. 개별 전송은 완료되거나 유실됩니다. 스트림 업로드에 대한 복원력을 보장하기 위해 스토리지 클라이언트 라이브러리는 업로드를 시작하기 전에 각 개별 REST 호출에 대한 데이터를 버퍼링합니다. 네트워크 속도 제한 외에도 이 버퍼링 동작은 순서대로 업로드하는 경우에도 더 작은 blockSize 값을 고려해야 하는 이유입니다. blockSize 값을 줄이면 각 요청 및 실패한 요청의 각 재시도에서 버퍼링되는 최대 데이터 양이 줄어듭니다. 특정 크기의 데이터 전송 동안 시간 제한이 자주 발생하는 경우 blockSize 값을 줄이면 버퍼링 시간이 줄어들고 성능이 향상될 수 있습니다.

다운로드 성능 튜닝

다운로드에 대한 튜닝 데이터 전송 옵션은 downloadToBuffer 메서드를 사용하는 경우에만 사용할 수 있습니다. 이 메서드는 BlobDownloadToBufferOptions에서 정의된 값에 따라 버퍼와 병렬로 Blob을 다운로드합니다. 다른 다운로드 방법은 데이터 전송 옵션 튜닝을 지원하지 않습니다.

다운로드를 위한 전송 옵션 설정

downloadToBuffer 메서드를 사용할 때 다운로드를 위해 다음 값을 조정할 수 있습니다.

  • blockSize: 각 요청에 대해 전송할 최대 블록 크기입니다.
  • 동시성: 단일 병렬 전송의 일부로 지정된 시간에 발급된 최대 병렬 요청 수입니다.

다운로드 성능 고려 사항

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

CRC64-NVME 사용하여 유효성 검사 전송

BlockBlobParallelUploadOptionsBlobDownloadToBufferOptions를 사용한 성능 튜닝 외에도, 업로드 및 다운로드의 데이터 무결성을 확인하도록 전송 유효성 검사를 구성할 수 있습니다. CRC64-NVME는 일반적으로 계산 성능이 우수하지만, 전송 검증을 활성화하면 다른 튜닝 결정과 함께 고려해야 할 성능상의 영향이 있을 수 있습니다.

CRC64-NVME 사용한 전송 유효성 검사는 Azure Blob Storage 클라이언트 수준 데이터 무결성을 제공하므로 애플리케이션에서 보낸 데이터가 Azure 저장되고 읽은 데이터와 동일한지 확인할 수 있습니다. 사용하도록 설정하면 Blob SDK는 업로드 및 다운로드 작업 중에 CRC64-NVME 체크섬을 계산하고 유효성을 검사하는 반면, 서비스는 수신하고 반환하는 데이터에 대해 CRC64-NVME 체크섬을 독립적으로 계산하고 유효성을 검사합니다. 각 요청 및 전체 데이터 스트림에서 유효성 검사가 수행되므로 블록 업로드 또는 범위가 지정된 읽기와 같은 파티션에서 데이터가 전송되는 경우에도 전체 Blob이 확인됩니다. 자세한 내용은 구조적 본문 형식 을 참조하세요.

BlobClientConfig를 사용하여 클라이언트 수준에서 전송 유효성 검사 옵션을 정의할 수 있습니다. 이 옵션은 BlobClient 인스턴스에서 호출된 모든 메서드에 유효성 검사 옵션을 적용합니다. 또는 BlobUploadOptions 또는 BlobDownloadOptions 와 같은 옵션을 통해 작업 수준에서 전송 유효성 검사 옵션을 재정의할 수 있습니다.

const blobServiceClient = new BlobServiceClient(
   `https://${account}.blob.core.windows.net`,
   new DefaultAzureCredential(),
   {
     uploadContentChecksumAlgorithm: "StorageCrc64",
     downloadContentChecksumAlgorithm: "StorageCrc64",
   }
);