使用 JavaScript 進行上傳和下載的效能微調
當應用程式使用適用於 JavaScript 的 Azure 儲存體用戶端程式庫傳輸資料時,有幾個因素可能會影響速度、儲存體使用量,甚至是要求的成功或失敗。 若要將資料傳輸的效能和可靠性最大化,請務必根據應用程式執行所在的環境主動設定用戶端程式庫傳輸選項。
本文會逐步解說微調資料傳輸選項的幾個考量。 正確調整時,用戶端程式庫可以有效率地將資料分散到多個要求,進而改善作業速度、儲存體使用量和網路穩定性。
上傳的效能微調
正確調整資料傳輸選項是上傳可靠效能的關鍵。 儲存體傳輸會根據這些引數的值分割成數個子傳輸。 支援的傳輸大小上限會因作業和服務版本而異,因此請務必檢查文件以判斷限制。 如需 Blob 儲存體傳輸大小限制的詳細資訊,請參閱調整 Blob 儲存體的目標。
設定上傳的傳輸選項
您可以在 BlockBlobParallelUploadOptions 中設定屬性,以改善資料傳輸作業的效能。 下表列出您可以設定的屬性,以及描述:
屬性 | 說明 |
---|---|
blockSize |
為每個要求傳輸的區塊大小上限 (作為上傳作業的一部分)。 若要深入了解,請參閱 blockSize。 |
maxSingleShotSize |
如果資料的大小小於或等於此值,則會在單一放置中上傳而不會分成區塊加以上傳。 如果資料是以單次上傳,則會忽略區塊大小。 預設值為 256 MB。 如果您定義此屬性,則必須使用小於或等於 256 MB 的值。 若要深入了解,請參閱 maxSingleShotSize。 |
concurrency |
在任何指定時間發出的平行要求數目上限 (作為單一平行傳輸一部分)。 |
注意
如果未提供,則用戶端程式庫會針對每個資料傳輸選項使用預設值。 這些預設值通常在資料中心環境中更有效率,但可能不適合家庭消費者環境。 微調不佳的資料傳輸選項可能會導致作業時間太長,甚至要求逾時。 最好主動測試這些值,並根據應用程式和環境的需求來調整這些值。
maxSingleShotSize
maxSingleShotSize
值是單一要求上傳的 Blob 大小上限 (以位元組為單位)。
如果資料大小小於或等於 maxSingleShotSize
,Blob 會以單一放置 Blob 要求上傳。 如果 Blob 大小大於 maxSingleShotSize
,或 Blob 大小未知,則會使用一系列的放置區塊呼叫,接著Put Block List
,以區塊方式上傳 Blob。
務必注意,您為 blockSize
指定的值不會限制您為 maxSingleShotSize
定義的值。 maxSingleShotSize
引數會定義個別的大小限制,讓要求一次執行整個作業且沒有子傳輸。 您通常會想要讓 maxSingleShotSize
的大小至少為您針對 blockSize
定義的值 (如果不是較大)。 視資料傳輸的大小,此方法可能更有效率,因為傳輸是以單一要求完成,並避免多個要求的額外負荷。
如果您不確定哪個值最適合您的情況,安全的選項是將 maxSingleShotSize
設定為用於 blockSize
的相同值。
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
設定為 8 MiB。 如果 Blob 大小小於 8 MiB,則只需要單一要求即能完成上傳作業。 如果 Blob 大小大於 8 MiB,Blob 會以區塊上傳 (區塊大小上限為 4 MiB,這是我們在 blockSize
屬性所定義的)。
上傳的效能考量
在上傳期間,儲存體用戶端程式庫會根據 BlockBlobParallelUploadOptions
定義的設定選項,將指定的上傳資料流分割成多個子上傳。 每個子上傳都有自己的專屬 REST 作業呼叫。 在此範例中,作業為 Put Block。 儲存體用戶端程式庫會平行管理這些 REST 作業(視傳輸選項而定),以完成完整上傳。
注意
區塊 Blob 的最大區塊計數為 50,000 個區塊。 那麼,您的區塊 Blob 的大小上限為 50,000 x block_size
。
上傳期間的緩衝處理
儲存體 REST 層不支援取得您離開的 REST 上傳作業;個別傳輸會是已完成或遺失。 為確保資料流上傳的復原能力,儲存體用戶端程式庫會先為每個個別 REST 呼叫緩衝處理資料,再開始上傳。 除了網路速度限制之外,此緩衝處理行為也是考量對 blockSize
使用較小值的原因,即使依序上傳也是如此。 減少 blockSize
的值會減少在每個要求上緩衝處理的資料量上限,以及每次重試失敗的要求。 如果您在特定大小的資料傳輸期間遇到頻繁逾時,減少 blockSize
的值會減少緩衝處理時間,並可能導致更好的效能。
下載的效能微調
只有在使用 downloadToBuffer 方法時,才能使用下載的微調資料傳輸選項。 此方法會根據 BlobDownloadToBufferOptions 中所定義的值,將 Blob 平行下載至緩衝區。 其他下載方法不支援微調資料傳輸選項。
設定下載的傳輸選項
使用 downloadToBuffer
方法時,可針對下載微調下列值:
- blockSize:為每個要求傳輸的區塊大小上限。
- concurrency:在任何指定時間發出的平行要求數目上限 (作為單一平行傳輸一部分)。
下載的效能考量
使用 downloadToBuffer
下載期間,儲存體用戶端程式庫會根據 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);
相關內容
- 若要深入了解可能影響 Azure 儲存體作業效能的因素,請參閱 Blob 儲存體中的延遲。
- 若要查看針對使用 Blob 儲存體的應用程式最佳化效能的設計考量清單,請參閱 Blob 儲存體的效能和延展性檢查清單。