Ottimizzazione delle prestazioni per caricamenti e download con Java
Quando un'applicazione trasferisce i dati usando la libreria client 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. Archiviazione trasferimenti vengono partizionati in diverse sottotrasferizioni 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 Destinazioni di scalabilità per l'archiviazione BLOB.
Impostare le opzioni di trasferimento per i caricamenti
È possibile configurare i valori in ParallelTransferOptions per migliorare le prestazioni per le operazioni di trasferimento dei dati. I valori seguenti possono essere ottimizzati per i caricamenti in base alle esigenze dell'app:
- maxSingleUploadSize: dimensione massima del BLOB in byte per un caricamento di una singola richiesta.
- blockSize: dimensione massima del blocco da trasferire per ogni richiesta.
- maxConcurrency: numero massimo di richieste parallele emesse 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 specificata. 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 maxSingleUploadSize
valore è 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 se le dimensioni del BLOB 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 per eseguire l'intera operazione contemporaneamente, senza subtransfer. È spesso il caso in cui si vuole maxSingleUploadSize
essere almeno grandi 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 blockSize
valore è la lunghezza massima di un trasferimento in byte durante il caricamento di un BLOB in blocchi in blocchi. Questo valore può essere impostato usando il metodo seguente:
Il blockSize
valore è la lunghezza massima di un trasferimento in byte durante il caricamento di un BLOB in blocchi in blocchi. Come accennato in precedenza, questo valore non limita maxSingleUploadSize
, che può essere maggiore di blockSize
.
Per mantenere in modo efficiente lo spostamento dei dati, le librerie client potrebbero non raggiungere sempre il blockSize
valore 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 Destinazioni di scalabilità per l'archiviazione BLOB.
maxConcurrency
Il maxConcurrency
valore è il numero massimo di richieste parallele emesse 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 seguente import
da 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 blobUploadFromFileOptions . Se non si esegue il caricamento da un file, è possibile impostare opzioni simili usando BlobParallelUploadOptions. I valori forniti in questo esempio non devono essere 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 parallelo su 2 usando il setMaxConcurrency
metodo . Si imposta anche su maxSingleUploadSize
8 MiB usando il setMaxSingleUploadSizeLong
metodo . 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, impostata usando il setBlockSizeLong
metodo .
Considerazioni sulle prestazioni per i caricamenti
Durante un caricamento, le librerie client Archiviazione suddivideno un determinato flusso di caricamento in più sottoupload in base alle opzioni di configurazione definite da ParallelTransferOptions
. Ogni sottoupload ha una propria chiamata dedicata all'operazione REST. Per un BlobClient
oggetto, questa operazione è Put Block. La libreria client Archiviazione gestisce queste operazioni REST in parallelo (a seconda delle opzioni di trasferimento) per completare il caricamento completo.
Nota
I BLOB in blocchi hanno un numero massimo di blocchi di 50.000 blocchi. Le dimensioni massime del BLOB in blocchi, quindi, sono 50.000 volte block_size
.
Memorizzazione nel buffer durante i caricamenti
Il livello REST Archiviazione non supporta la raccolta di un'operazione di caricamento REST in cui è stata interrotta. I singoli trasferimenti vengono completati o persi. Per garantire la resilienza per i caricamenti di flussi, i dati del buffer delle librerie client Archiviazione 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 carica in sequenza. La riduzione del valore di blockSize
riduce la quantità massima di dati memorizzati nel buffer per ogni richiesta e ogni nuovo tentativo di una richiesta non riuscita. Se si verificano timeout frequenti durante i trasferimenti di dati di una determinata dimensione, riducendo il valore di riduce il tempo di blockSize
memorizzazione nel buffer e può comportare 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. Archiviazione trasferimenti vengono partizionati in diverse sottotrasferizioni in base ai valori definiti in ParallelTransferOptions
.
Impostare le opzioni di trasferimento per i download
I valori seguenti possono essere ottimizzati per i download in base alle esigenze dell'app:
blockSize
: dimensione massima del blocco da trasferire per ogni richiesta. È possibile impostare questo valore usando il metodo setBlockSizeLong .maxConcurrency
: numero massimo di richieste parallele inviate 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 seguente import
da 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 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 Archiviazione suddivideno 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 completo.
Passaggi successivi
- Per altre informazioni sui fattori che possono influenzare le prestazioni per le operazioni di Archiviazione di Azure, vedere Latenza nell'archiviazione BLOB.
- Per un elenco delle considerazioni di progettazione per ottimizzare le prestazioni per le app che usano l'archiviazione BLOB, vedere Elenco di controllo per le prestazioni e la scalabilità per l'archiviazione BLOB.
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per