Réglage des performances pour les chargements et les téléchargements avec Java
Quand une application transfère des données en utilisant la bibliothèque de client du Stockage Azure pour Java, plusieurs facteurs peuvent affecter la vitesse, l’utilisation de la mémoire, et même la réussite ou l’échec de la demande. 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 arguments. 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
Vous pouvez configurer les valeurs dans ParallelTransferOptions pour améliorer les performances des opérations de transfert de données. Les valeurs suivantes peuvent être réglées pour les chargements en fonction des besoins de votre application :
- maxSingleUploadSize : taille de blob maximale en octets pour un chargement avec une seule demande.
- blockSize : taille de bloc maximale à transférer pour chaque demande.
- maxConcurrency : nombre maximal de demandes parallèles envoyées à un moment donné dans le cadre du même transfert parallèle.
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.
maxSingleUploadSize
La valeur maxSingleUploadSize
est la taille de blob maximale en octets pour un chargement avec une seule demande. Cette valeur peut être définie avec la méthode suivante :
Si la taille des données est inférieure ou égale à maxSingleUploadSize
, le blob est chargé avec une seule demande Put Blob. Si la taille de l’objet blob est supérieure à maxSingleUploadSize
ou si la taille de l’objet blob est inconnue, l’objet blob est chargé en blocs à l’aide d’une série d’appels Put Block suivie de Put Block List.
Il est important de noter que la valeur pour laquelle vous spécifiez blockSize
ne limite pas la valeur que vous définissez pour maxSingleUploadSize
. L’argument maxSingleUploadSize
définit une limitation de taille distincte pour une requête permettant d’effectuer l’ensemble de l’opération en même temps, sans sous-transfert. Il arrive souvent que vous souhaitiez que maxSingleUploadSize
soit au moins aussi importante que la valeur que vous définissez pour blockSize
, si ce n’est plus. En fonction de la taille du transfert de données, cette approche peut être plus performante, car le transfert est effectué avec une seule demande et évite la surcharge de plusieurs demandes.
Si vous n’êtes pas sûr de la valeur la mieux adaptée à votre situation, une option sécurisée consiste à définir maxSingleUploadSize
sur la même valeur que celle utilisée pour blockSize
.
blockSize
La valeur blockSize
est la longueur maximale d’un transfert en octets pendant le chargement d’un blob de blocs en blocs. Cette valeur peut être définie avec la méthode suivante :
La valeur blockSize
est la longueur maximale d’un transfert en octets pendant le chargement d’un blob de blocs en blocs. Comme mentionné précédemment, cette valeur ne limite maxSingleUploadSize
pas, qui peut être supérieure à blockSize
.
Pour que les données se déplacent efficacement, les bibliothèques clientes peuvent 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.
maxConcurrency
La valeur maxConcurrency
est le nombre maximal de demandes parallèles envoyées à un moment donné dans le cadre du même transfert parallèle. Cette valeur peut être définie avec la méthode suivante :
Exemple de code
Vérifiez que vous avez la directive import
suivante afin d’utiliser ParallelTransferOptions
pour un chargement :
import com.azure.storage.blob.models.*;
L’exemple de code suivant montre comment définir des valeurs pour ParallelTransferOptions et inclure les options dans le cadre d’une instance BlobUploadFromFileOptions. Si vous n’effectuez pas le chargement à partir d’un fichier, vous pouvez définir des options similaires avec BlobParallelUploadOptions. 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.
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);
Dans cet exemple, nous définissons le nombre de workers de transfert parallèle sur 2, en utilisant la propriété setMaxConcurrency
. Nous définissons également maxSingleUploadSize
sur 8 Mio avec la méthode setMaxSingleUploadSizeLong
. Si la taille de l’objet blob est inférieure à 8 Mio, une seule requête est nécessaire pour terminer l’opération de chargement. Si la taille de blob est supérieure à 8 Mio, le blob est chargé en blocs avec une taille de bloc maximale de 4 Mio, comme nous l’avons défini avec la méthode setBlockSizeLong
.
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 par ParallelTransferOptions
. Chaque sous-chargement a son propre appel dédié à l’opération REST. Pour un objet BlobClient
, cette opération est Put Block. 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.
Remarque
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 les délais d’expiration pendant les transferts de données d’une certaine taille sont fréquents, la réduction de la valeur blockSize
réduit le temps de mise en mémoire tampon et peut 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 définies dans ParallelTransferOptions
.
Définir les options de transfert pour les téléchargements
Les valeurs suivantes peuvent être ajustées pour les téléchargements en fonction des besoins de votre application :
blockSize
: taille de bloc maximale à transférer pour chaque requête. Vous pouvez définir cette valeur à l’aide de la méthode setBlockSizeLong.maxConcurrency
: nombre maximal de requêtes parallèles émises à un moment donné dans le cadre d’un transfert parallèle unique. Vous pouvez définir cette valeur à l’aide de la méthode setMaxConcurrency.
Exemple de code
Vérifiez que vous avez la directive import
suivante afin d’utiliser ParallelTransferOptions
pour un téléchargement :
import com.azure.storage.common.*;
L’exemple de code suivant montre comment définir des valeurs pour ParallelTransferOptions et ajouter les options dans le cadre d’une instance 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);
Considérations relatives aux performances pour les téléchargements
Pendant un téléchargement, les bibliothèques de client de stockage divisent une demande de téléchargement donnée en plusieurs sous-téléchargements en fonction des options de configuration définies par ParallelTransferOptions
. 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.
Étapes suivantes
- Cet article fait partie du guide du développeur Stockage Blob pour Java. Vous pouvez consulter la liste complète des articles du guide du développeur sur Générer votre application.
- Pour en savoir plus sur les facteurs qui peuvent influencer les performances des opérations de stockage Azure, consultez Latence dans le stockage Blob.
- Pour obtenir la liste des considérations relatives à la conception afin d’optimiser les performances des applications utilisant le stockage Blob, consultez Liste de contrôle des performances et de l’extensibilité pour le stockage Blob.