Condividi tramite


Ottimizzazione delle prestazioni per caricamenti e download con Go

Quando un'applicazione trasferisce i dati usando la libreria client Archiviazione di Azure per Go, 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 diverse sottotrasferizioni in base ai valori di queste proprietà. 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

Se la dimensione totale del BLOB è minore o uguale a 256 MB, i dati vengono caricati con una singola richiesta Put Blob . Se le dimensioni del BLOB sono maggiori di 256 MB 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.

Le proprietà seguenti possono essere configurate e ottimizzate in base alle esigenze dell'app:

  • BlockSize: lunghezza massima di un trasferimento in byte durante il caricamento di un BLOB in blocchi in blocchi. Il valore predefinito è 4 MB.
  • Concurrency: numero massimo di subtransfer che possono essere usati in parallelo. Il valore predefinito è 5.

Queste opzioni di configurazione sono disponibili durante il caricamento usando i metodi seguenti:

Il metodo Upload non supporta queste opzioni e carica i dati in una singola richiesta.

Nota

Le librerie client usano le impostazioni predefinite per ogni opzione di trasferimento 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.

BlockSize

L'argomento BlockSize è la lunghezza massima di un trasferimento in byte durante il caricamento di un BLOB in blocchi in parti.

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.

Esempio di codice

Nell'esempio di codice seguente viene illustrato come definire i valori per un'istanza di UploadFileOptions e passare queste opzioni di configurazione come parametro a UploadFile.

I valori forniti in questo esempio non sono necessariamente quelli consigliati. Per ottimizzare correttamente questi valori, è necessario considerare le esigenze specifiche dell'app.

func uploadBlobWithTransferOptions(client *azblob.Client, containerName string, blobName string) {
    // Open the file for reading
    file, err := os.OpenFile("path/to/sample/file", os.O_RDONLY, 0)
    handleError(err)

    defer file.Close()

    // Upload the data to a block blob with transfer options
    _, err = client.UploadFile(context.TODO(), containerName, blobName, file,
        &azblob.UploadFileOptions{
            BlockSize:   int64(8 * 1024 * 1024), // 8 MiB
            Concurrency: uint16(2),
        })
    handleError(err)
}

In questo esempio il numero di lavoratori di trasferimento parallelo viene impostato su 2, usando il Concurrency campo . Questa configurazione si apre contemporaneamente a due connessioni, consentendo il caricamento in parallelo. Se le dimensioni del BLOB sono superiori a 256 MB, il BLOB viene caricato in blocchi con una dimensione massima di 8 MiB, come impostato dal Block_Size campo.

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 durante la costruzione del cliente. Ogni sottocaricamento ha una propria chiamata dedicata all'operazione REST. La libreria client di archiviazione gestisce queste operazioni REST in parallelo (a seconda delle opzioni di trasferimento) per completare il caricamento.

Per informazioni su come la libreria client gestisce il buffering consultare le sezioni seguenti.

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 diverse sottotrasferizioni in base ai valori di queste proprietà.

Impostare le opzioni di trasferimento per i download

Le proprietà seguenti possono essere ottimizzate in base alle esigenze dell'app:

  • BlockSize: dimensioni massime del blocco da usare per il download di un BLOB. Il valore predefinito è 4 MB.
  • Concurrency: numero massimo di subtransfer che possono essere usati in parallelo. Il valore predefinito è 5.

Queste opzioni sono disponibili durante il download usando i metodi seguenti:

Il metodo DownloadStream non supporta queste opzioni e scarica i dati in una singola richiesta.

Esempio di codice

Nell'esempio di codice seguente viene illustrato come definire i valori per un'istanza downloadFileOptions e passare queste opzioni di configurazione come parametro a DownloadFile.

I valori forniti in questo esempio non sono necessariamente quelli consigliati. Per ottimizzare correttamente questi valori, è necessario considerare le esigenze specifiche dell'app.

func downloadBlobTransferOptions(client *azblob.Client, containerName string, blobName string) {
    // Create or open a local file where we can download the blob
	file, err := os.Create("path/to/sample/file")
	handleError(err)

	// Download the blob to the local file
	_, err = client.DownloadFile(context.TODO(), containerName, blobName, file,
		&azblob.DownloadFileOptions{
			BlockSize:   int64(4 * 1024 * 1024), // 4 MiB
			Concurrency: uint16(2),
		})
	handleError(err)
}

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 durante la costruzione del client. 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.