Condividi tramite


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 maxSingleUploadSizeo 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 blockSizenon 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