Condividi tramite


Ottimizzazione delle prestazioni per caricamenti e download con Java

Quando un'applicazione trasferisce i dati usando la libreria client di Archiviazione di Azure per Java, esistono diversi fattori che possono influire sulla velocità, sull'utilizzo della memoria e persino sull'esito positivo o negativo della richiesta. Per ottimizzare le prestazioni e l'affidabilità per i trasferimenti di dati, è importante essere proattivi nella configurazione delle opzioni di trasferimento della libreria client in base all'ambiente in cui viene eseguita l'app.

Questo articolo illustra diverse considerazioni per l'ottimizzazione delle opzioni di trasferimento dei dati. Se ottimizzata correttamente, la libreria client può distribuire in modo efficiente i dati tra più richieste, con conseguente miglioramento della velocità operativa, dell'utilizzo della memoria e della stabilità di rete.

Ottimizzazione delle prestazioni per i caricamenti

L'ottimizzazione corretta delle opzioni di trasferimento dei dati è fondamentale per ottenere prestazioni affidabili per i caricamenti. I trasferimenti di archiviazione vengono partizionati in diversi sottotrasferimenti in base ai valori di questi argomenti. Le dimensioni massime di trasferimento supportate variano in base all'operazione e alla versione del servizio, quindi assicurarsi di controllare la documentazione per determinare i limiti. Per altre informazioni sui limiti delle dimensioni di trasferimento per l'archiviazione BLOB, vedere Dimensionare le destinazioni per l'archiviazione BLOB.

Impostare le opzioni di trasferimento per i caricamenti

È possibile configurare valori in ParallelTransferOptions per migliorare le prestazioni delle operazioni di trasferimento dei dati. È possibile ottimizzare i valori seguenti relativi ai caricamenti in base alle esigenze dell'app:

  • maxSingleUploadSize: dimensione massima del BLOB in byte per un caricamento di una singola richiesta.
  • blockSize: dimensioni massime del blocco da trasferire per ogni richiesta.
  • maxConcurrency: numero massimo di richieste parallele generate in qualsiasi momento come parte di un singolo trasferimento parallelo.

Nota

Le librerie client useranno le impostazioni predefinite per ogni opzione di trasferimento dei dati, se non specificato altrimenti. Queste impostazioni predefinite sono in genere efficienti in un ambiente data center, ma non sono adatte per gli ambienti consumer domestici. Le opzioni di trasferimento dei dati non ottimizzate possono comportare operazioni eccessivamente lunghe e persino timeout delle richieste. È consigliabile essere proattivi nel testare questi valori e ottimizzarli in base alle esigenze dell'applicazione e dell'ambiente.

maxSingleUploadSize

Il valore maxSingleUploadSize è la dimensione massima del BLOB in byte per un caricamento di una singola richiesta. Questo valore può essere impostato usando il metodo seguente:

Se le dimensioni dei dati sono minori o uguali a maxSingleUploadSize, il BLOB viene caricato con una singola richiesta Put BLOB. Se le dimensioni del BLOB sono maggiori di maxSingleUploadSize o sono sconosciute, il BLOB viene caricato in blocchi usando una serie di chiamate Put Block seguite da Put Block List.

È importante notare che il valore specificato per blockSize non limita il valore definito per maxSingleUploadSize. L'argomento maxSingleUploadSize definisce una limitazione delle dimensioni separata per una richiesta in modo da eseguire l'intera operazione contemporaneamente, senza sottotrasferimenti. Spesso si vuole che maxSingleUploadSize sia almeno grande quanto il valore definito per blockSize, se non più grande. A seconda delle dimensioni del trasferimento dei dati, questo approccio può essere più efficiente, poiché il trasferimento viene completato con una singola richiesta ed evita il sovraccarico di più richieste.

Se non si è certi del valore migliore per la situazione, un'opzione sicura consiste nell'impostare maxSingleUploadSize sullo stesso valore usato per blockSize.

blockSize

Il valore blockSize è la lunghezza massima di un trasferimento in byte durante il caricamento di un BLOB in blocchi in parti. Questo valore può essere impostato usando il metodo seguente:

Il valore blockSize è la lunghezza massima di un trasferimento in byte durante il caricamento di un BLOB in blocchi in parti. Come accennato in precedenza, questo valore non limita maxSingleUploadSize, che può essere maggiore di blockSize.

Per mantenere efficiente lo spostamento dei dati, le librerie client potrebbero non raggiungere sempre il valore blockSize per ogni trasferimento. A seconda dell'operazione, il valore massimo supportato per le dimensioni del trasferimento può variare. Per altre informazioni sui limiti delle dimensioni di trasferimento per l'archiviazione BLOB, vedere il grafico in Dimensionare le destinazioni per l'archiviazione BLOB.

maxConcurrency

Il valore maxConcurrency è il numero massimo di richieste parallele generate in qualsiasi momento come parte di un singolo trasferimento parallelo. Questo valore può essere impostato usando il metodo seguente:

Esempio di codice

Assicurarsi di disporre della direttiva import seguente per usare ParallelTransferOptions per un caricamento:

import com.azure.storage.blob.models.*;

Nell'esempio di codice seguente viene illustrato come impostare i valori per ParallelTransferOptions e includere le opzioni come parte di un'istanza di BlobUploadFromFileOptions. Se non si esegue il caricamento da un file, è possibile impostare opzioni simili usando BlobParallelUploadOptions. I valori forniti in questo esempio non sono necessariamente quelli consigliati. Per ottimizzare correttamente questi valori, è necessario considerare le esigenze specifiche dell'app.

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

In questo esempio viene impostato il numero massimo di ruoli di lavoro di trasferimento paralleli su 2 usando il metodo setMaxConcurrency. Impostiamo anche maxSingleUploadSize su 8 MiB usando il metodo setMaxSingleUploadSizeLong. Se le dimensioni del BLOB sono inferiori a 8 MiB, è necessaria solo una singola richiesta per completare l'operazione di caricamento. Se le dimensioni del BLOB sono maggiori di 8 MiB, il BLOB viene caricato in blocchi con una dimensione massima di 4 MiB, come impostato dal metodo setBlockSizeLong.

Considerazioni sulle prestazioni per i caricamenti

Durante un caricamento, le librerie client di archiviazione suddividono un determinato flusso di caricamento in più sottocaricamenti in base alle opzioni di configurazione definite da ParallelTransferOptions. Ogni sottocaricamento ha una propria chiamata dedicata all'operazione REST. Per un oggetto BlobClient, questa operazione è Put Block. La libreria client di archiviazione gestisce queste operazioni REST in parallelo (a seconda delle opzioni di trasferimento) per completare il caricamento.

Nota

I BLOB in blocchi hanno un numero massimo di 50.000 blocchi. Le dimensioni massime del BLOB in blocchi, quindi, sono pari a 50.000 volte block_size.

Buffering durante i caricamenti

Il livello REST di archiviazione non supporta la ripresa di un'operazione di caricamento REST che è stata interrotta. I singoli trasferimenti vengono completati o persi. Per garantire la resilienza per i caricamenti di flussi, le librerie client di archiviazione eseguono il buffer dei dati per ogni singola chiamata REST prima di avviare il caricamento. Oltre alle limitazioni della velocità di rete, questo comportamento di buffering è un motivo per considerare un valore più piccolo per blockSize, anche quando si effettuano caricamenti in sequenza. La riduzione del valore di blockSize riduce la quantità massima di dati memorizzati nel buffer per ogni richiesta e per ogni retry di una richiesta non riuscita. Se si verificano timeout frequenti durante i trasferimenti di dati di una determinata dimensione, riducendo il valore di blockSize si riduce il tempo di memorizzazione nel buffer e si possono ottenere prestazioni migliori.

Ottimizzazione delle prestazioni per i download

L'ottimizzazione corretta delle opzioni di trasferimento dei dati è fondamentale per ottenere prestazioni affidabili per i download. I trasferimenti di archiviazione vengono partizionati in diversi sottotrasferimenti in base ai valori definiti in ParallelTransferOptions.

Impostare le opzioni di trasferimento per i download

È possibile ottimizzare i valori seguenti relativi ai download in base alle esigenze dell'app:

  • blockSize: dimensioni massime del blocco da trasferire per ogni richiesta. È possibile impostare questo valore usando il metodo setBlockSizeLong.
  • maxConcurrency: numero massimo di richieste parallele generate in qualsiasi momento come parte di un singolo trasferimento parallelo. È possibile impostare questo valore usando il metodo setMaxConcurrency.

Esempio di codice

Assicurarsi di disporre della direttiva import seguente per usare ParallelTransferOptions per un download:

import com.azure.storage.common.*;

Nell'esempio di codice seguente viene illustrato come impostare i valori per ParallelTransferOptions e includere le opzioni come parte di un'istanza di 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);

Considerazioni sulle prestazioni per i download

Durante un download, le librerie client di archiviazione suddividono una determinata richiesta di download in più download secondari in base alle opzioni di configurazione definite da ParallelTransferOptions. Ogni sottodownload ha una propria chiamata dedicata all'operazione REST. A seconda delle opzioni di trasferimento, le librerie client gestiscono queste operazioni REST in parallelo per completare il download.

Passaggi successivi