共用方式為


使用 Java 進行上傳和下載的效能微調

當應用程式使用適用於 Java 的 Azure 儲存體用戶端程式庫傳輸資料時,有幾個因素可能會影響速度、儲存體使用量,甚至是要求的成功或失敗。 若要將資料傳輸的效能和可靠性最大化,請務必根據應用程式執行所在的環境主動設定用戶端程式庫傳輸選項。

本文會逐步解說微調資料傳輸選項的幾個考量。 正確調整時,用戶端程式庫可以有效率地將資料分散到多個要求,進而改善作業速度、儲存體使用量和網路穩定性。

上傳的效能微調

正確調整資料傳輸選項是上傳可靠效能的關鍵。 儲存體傳輸會根據這些引數的值分割成數個子傳輸。 支援的傳輸大小上限會因作業和服務版本而異,因此請務必檢查文件以判斷限制。 如需 Blob 儲存體傳輸大小限制的詳細資訊,請參閱調整 Blob 儲存體的目標

設定上傳的傳輸選項

您可以在 ParallelTransferOptions 中設定值,以改善資料傳輸作業的效能。 您可以根據應用程式的需求來為上傳調整下列值:

  • maxSingleUploadSize:單一要求上傳的 Blob 大小上限 (以位元組為單位)。
  • blockSize:為每個要求傳輸的區塊大小上限。
  • maxConcurrency:在任何指定時間發出的平行要求數目上限 (作為單一平行傳輸一部分)。

注意

如果未提供,則用戶端程式庫會針對每個資料傳輸選項使用預設值。 這些預設值通常在資料中心環境中更有效率,但可能不適合家庭消費者環境。 微調不佳的資料傳輸選項可能會導致作業時間太長,甚至要求逾時。 最好主動測試這些值,並根據應用程式和環境的需求來調整這些值。

maxSingleUploadSize

maxSingleUploadSize 值是單一要求上傳的 Blob 大小上限 (以位元組為單位)。 使用下列方法即可設定此值:

如果資料大小小於或等於 maxSingleUploadSize,Blob 會以單一放置 Blob 要求上傳。 如果 Blob 大小大於 maxSingleUploadSize,或 Blob 大小未知,則會使用一系列的放置區塊呼叫,接著放置區塊清單,以區塊方式上傳 Blob。

務必注意,您為 blockSize 指定的值不會限制您為 maxSingleUploadSize 定義的值。 maxSingleUploadSize 引數會定義個別的大小限制,讓要求一次執行整個作業且沒有子傳輸。 您通常會想要讓 maxSingleUploadSize 的大小至少為您針對 blockSize 定義的值 (如果不是較大)。 視資料傳輸的大小,此方法可能更有效率,因為傳輸是以單一要求完成,並避免多個要求的額外負荷。

如果您不確定哪個值最適合您的情況,安全的選項是將 maxSingleUploadSize 設定為用於 blockSize 的相同值。

blockSize

blockSize 值是在區塊中上傳區塊 Blob 時,傳輸的最大長度 (以位元組為單位)。 使用下列方法即可設定此值:

blockSize 值是在區塊中上傳區塊 Blob 時,傳輸的最大長度 (以位元組為單位)。 如先前所述,這個值不會限制 maxSingleUploadSize,其可能大於 blockSize

為了保持移動資料有效率地,用戶端程式庫的每個傳輸不一定會達到 blockSize 值。 視作業而定,傳輸大小支援的最大值可能會有所不同。 如需 Blob 儲存體傳輸大小限制的詳細資訊,請參閱調整 Blob 儲存體的目標中的圖表。

maxConcurrency

maxConcurrency 值是在任何指定時間發出的平行要求數目上限 (作為單一平行傳輸一部分)。 使用下列方法即可設定此值:

程式碼範例

請確定您有下列 import 指示詞,以使用 ParallelTransferOptions 進行上傳:

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,則只需要單一要求即能完成上傳作業。 如果 Blob 大小大於 8 MiB,Blob 會以區塊上傳 (區塊大小上限為 4 MiB,這是我們使用 setBlockSizeLong 方法所設定的)。

上傳的效能考量

在上傳期間,儲存體用戶端程式庫會根據 ParallelTransferOptions 定義的設定選項,將指定的上傳資料流分割成多個子上傳。 每個子上傳都有自己的專屬 REST 作業呼叫。 對於 BlobClient 物件,此作業為放置區塊。 儲存體用戶端程式庫會平行管理這些 REST 作業(視傳輸選項而定),以完成完整上傳。

注意

區塊 Blob 的最大區塊計數為 50,000 個區塊。 那麼,您的區塊 Blob 的大小上限為 50,000 x block_size

上傳期間的緩衝處理

儲存體 REST 層不支援取得您離開的 REST 上傳作業;個別傳輸會是已完成或遺失。 為確保資料流上傳的復原能力,儲存體用戶端程式庫會先為每個個別 REST 呼叫緩衝處理資料,再開始上傳。 除了網路速度限制之外,此緩衝處理行為也是考量對 blockSize 使用較小值的原因,即使依序上傳也是如此。 減少 blockSize 的值會減少在每個要求上緩衝處理的資料量上限,以及每次重試失敗的要求。 如果您在特定大小的資料傳輸期間遇到頻繁逾時,減少 blockSize 的值會減少緩衝處理時間,並可能導致更好的效能。

下載的效能微調

正確調整資料傳輸選項是下載可靠效能的關鍵。 儲存體傳輸會根據 ParallelTransferOptions 中定義的值分割成數個子傳輸。

設定下載的傳輸選項

您可以根據應用程式的需求來為下載調整下列值:

  • blockSize:為每個要求傳輸的區塊大小上限。 您可以使用 setBlockSizeLong 方法來設定此值。
  • maxConcurrency:在任何指定時間發出的平行要求數目上限 (作為單一平行傳輸一部分)。 您可以使用 setMaxConcurrency 方法來設定此值。

程式碼範例

請確定您有下列 import 指示詞,以使用 ParallelTransferOptions 進行下載:

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

下載的效能考量

在下載期間,儲存體用戶端程式庫會根據 ParallelTransferOptions 定義的設定選項,將指定的下載要求分割成多個子下載。 每個子下載都有自己的專屬 REST 作業呼叫。 視傳輸選項而定,用戶端程式庫會平行管理這些 REST 作業,以完成完整下載。

下一步