Partager via


Réglage du niveau de performance pour les chargements et les téléchargements avec Go

Lorsqu’une application transfère des données à l’aide de la bibliothèque de client Stockage Azure pour Go, plusieurs facteurs peuvent affecter la vitesse, l’utilisation de la mémoire et même la réussite ou l’échec de la requête. Pour optimiser les performances et la fiabilité des transferts de données, il est important de configurer les options de transfert d’une bibliothèque de client de manière proactive en fonction de l’environnement dans lequel l’application s’exécute.

Cet article décrit plusieurs considérations relatives au réglage des options de transfert de données. Lorsqu’elle est correctement paramétrée, la bibliothèque cliente peut distribuer efficacement les données entre plusieurs requêtes, ce qui peut améliorer la vitesse d’opération, l’utilisation de la mémoire et la stabilité du réseau.

Réglage des performances des chargements

Le réglage correct des options de transfert de données est essentiel pour des performances fiables pour les chargements. Les transferts de stockage sont divisés en plusieurs sous-transferts en fonction des valeurs de ces propriétés. La taille maximale de transfert prise en charge varie selon l’opération et la version du service. Veillez donc à consulter la documentation pour déterminer les limites. Pour plus d’informations sur les limites de taille de transfert pour le stockage Blob, consultez Cibles de mise à l’échelle pour le stockage Blob.

Définir les options de transfert pour les chargements

Si la taille totale de l’objet blob est inférieure ou égale à 256 Mo, les données sont chargées en une seule requête Put Blob. Si la taille de l’objet blob est supérieure à 256 Mo, ou si elle est inconnue, l’objet blob est chargé en blocs à l’aide d’une série d’appels Put Block suivie de Put Block List.

Les propriétés suivantes peuvent être configurées en fonction des besoins de votre application :

  • BlockSize : longueur maximale d’un transfert en octets lors du chargement en blocs d’un objet blob de blocs. La valeur par défaut est 4 Mo.
  • Concurrency : nombre maximal de sous-transferts pouvant être utilisés en parallèle. La valeur par défaut est 5.

Ces options de configuration sont disponibles lors du chargement à l’aide des méthodes suivantes :

La méthode Upload ne prend pas en charge ces options, et charge les données en une seule requête.

Remarque

Les bibliothèques de client utilisent les valeurs par défaut pour chaque option de transfert de données, si elles ne sont pas fournies. Ces valeurs par défaut sont généralement performantes dans un environnement de centre de données, mais elles ne sont pas susceptibles d’être adaptées aux environnements de consommation domestique. Un réglage médiocre des options de transfert de données peut entraîner des opérations excessivement longues et même des délais d’attente de demande. Il est préférable d’être proactif dans le test de ces valeurs, et de les régler en fonction des besoins de votre application et de votre environnement.

BlockSize

L’argument BlockSize est la longueur maximale d’un transfert en octets lors du chargement d’un objet blob de blocs en blocs.

Pour que les données se déplacent efficacement, les bibliothèques clientes risquent de ne pas toujours atteindre la valeur BlockSize pour chaque transfert. Selon l’opération, la valeur maximale prise en charge pour la taille de transfert peut varier. Pour plus d’informations sur les limites de taille de transfert pour le stockage Blob, consultez le graphique dans Cibles de mise à l’échelle pour le stockage Blob.

Exemple de code

L’exemple de code suivant montre comment définir des valeurs pour une instance UploadFileOptions et passer ces options de configuration en tant que paramètre à UploadFile.

Les valeurs fournies dans cet exemple ne sont pas destinées à être une recommandation. Pour régler correctement ces valeurs, vous devez tenir compte des besoins spécifiques de votre application.

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

Dans cet exemple, nous définissons le nombre de workers de transfert parallèle sur 2, à l’aide du champ Concurrency. Cette configuration ouvre jusqu’à deux connexions simultanément, ce qui permet au chargement de se produire en parallèle. Si la taille de l’objet blob est supérieure à 256 Mo, il est chargé en blocs avec une taille de bloc maximale de 8 Mio, comme défini par le champ Block_Size.

Considérations relatives aux performances pour les chargements

Pendant un chargement, les bibliothèques de client de stockage divisent un flux de chargement donné en plusieurs sous-chargements en fonction des options de configuration définies lors de la construction du client. Chaque sous-chargement a son propre appel dédié à l’opération REST. La bibliothèque cliente de stockage gère ces opérations REST en parallèle (en fonction des options de transfert) pour terminer le chargement complet.

Vous pouvez découvrir comment la bibliothèque de client gère la mise en mémoire tampon dans les sections suivantes.

Notes

Les objets blob de blocs ont un nombre maximal de blocs de 50 000 blocs. La taille maximale de votre objet blob de blocs est alors de 50 000 fois Block_Size.

Mise en mémoire tampon pendant les chargements

La couche REST de stockage ne prend pas en charge la prise en charge d’une opération de chargement REST là où vous l’avez laissée ; les transferts individuels sont terminés ou perdus. Pour garantir la résilience pour les chargements de flux, les bibliothèques de client de stockage mettent en mémoire tampon les données de chaque appel REST individuel avant de commencer le chargement. En plus des limitations de vitesse réseau, ce comportement de mise en mémoire tampon est une raison d’envisager une valeur plus petite pour BlockSize, même lors du chargement dans l’ordre. La diminution de la valeur de BlockSize réduit la quantité maximale de données mises en mémoire tampon sur chaque requête et chaque nouvelle tentative d’une requête ayant échoué. Si vous subissez des dépassements de délai fréquents d’expiration pendant les transferts de données d’une certaine taille, la réduction de la valeur BlockSize réduit le temps de mise en mémoire tampon et pourrait entraîner de meilleures performances.

Réglage des performances des téléchargements

Le réglage correct des options de transfert de données est essentiel pour des performances fiables pour les téléchargements. Les transferts de stockage sont divisés en plusieurs sous-transferts en fonction des valeurs de ces propriétés.

Définir les options de transfert pour les téléchargements

Les propriétés suivantes peuvent être paramétrées en fonction des besoins de votre application :

  • BlockSize : taille de bloc maximale utilisée pour le téléchargement d’un blob. La valeur par défaut est 4 Mo.
  • Concurrency : nombre maximal de sous-transferts pouvant être utilisés en parallèle. La valeur par défaut est 5.

Ces options sont disponibles lors du téléchargement à l’aide des méthodes suivantes :

La méthode DownloadStream ne prend pas en charge ces options, et télécharge les données en une seule requête.

Exemple de code

L’exemple de code suivant montre comment définir des valeurs pour une instance DownloadFileOptions et passer ces options de configuration en tant que paramètre à DownloadFile.

Les valeurs fournies dans cet exemple ne sont pas destinées à être une recommandation. Pour régler correctement ces valeurs, vous devez tenir compte des besoins spécifiques de votre application.

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

Considérations relatives aux performances pour les téléchargements

Pendant un téléchargement, les bibliothèques de client de stockage fractionnent une requête de téléchargement donnée en plusieurs sous-téléchargements en fonction des options de configuration définies lors de la construction du client. Chaque sous-téléchargement a son propre appel dédié à l’opération REST. Selon les options de transfert, les bibliothèques clientes gèrent ces opérations REST en parallèle pour terminer le téléchargement complet.