Partager via


Réglage des performances pour les chargements et les téléchargements avec JavaScript

Quand une application transfère des données en utilisant la bibliothèque de client du Stockage Azure pour JavaScript, plusieurs facteurs peuvent affecter la vitesse, l’utilisation de la mémoire, et même la réussite ou la défaillance 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 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 des propriétés dans BlockBlobParallelUploadOptions pour améliorer le niveau de performance des opérations de transfert de données. Le tableau suivant répertorie les propriétés que vous pouvez configurer, ainsi qu’une description :

Propriété Description
blockSize Taille de bloc maximale à transférer pour chaque requête dans le cadre d’une opération de chargement. Pour en savoir plus, veuillez consulter la rubrique blockSize.
maxSingleShotSize Si la taille des données est inférieure ou égale à cette valeur, elles sont chargées en un seul PUT, au lieu de les diviser en blocs. Si les données sont chargées en une seule capture, la taille du bloc est ignorée. La valeur par défaut est 256 Mo. Si vous personnalisez cette propriété, vous devez utiliser une valeur inférieure ou égale à 256 Mo. Pour en savoir plus, veuillez consulter la rubrique maxSingleShotSize.
concurrency Nombre maximal de requêtes parallèles émises à un moment donné dans le cadre d’un transfert parallèle unique.

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.

maxSingleShotSize

La valeur maxSingleShotSize est la taille de blob maximale en octets pour un chargement avec une seule demande.

Si la taille des données est inférieure ou égale à maxSingleShotSize, le blob est chargé avec une seule demande Put Blob. Si la taille de l’objet blob est supérieure à maxSingleShotSize 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 maxSingleShotSize. L’argument maxSingleShotSize 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 maxSingleShotSize 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 maxSingleShotSize 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.

Comme mentionné précédemment, cette valeur ne limite maxSingleShotSizepas, qui peut être supérieure à blockSize.

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 BlockBlobParallelUploadOptions et inclure les options dans le cadre d’une appel de méthode de chargement. Les valeurs fournies dans les exemples 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.

// Specify data transfer options
const uploadOptions = {
  blockSize: 4 * 1024 * 1024, // 4 MiB max block size
  concurrency: 2, // maximum number of parallel transfer workers
  maxSingleShotSize: 8 * 1024 * 1024, // 8 MiB initial transfer size
} 

// Create blob client from container client
const blockBlobClient = containerClient.getBlockBlobClient(blobName);

// Upload blob with transfer options
await blockBlobClient.uploadFile(localFilePath, uploadOptions);

Dans cet exemple, nous définissons le nombre de workers de transfert parallèle sur 2, en utilisant la propriété concurrency. Nous avons également défini maxSingleShotSize sur 8 Mio. 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 du blob est supérieure à 8 Mio, le blob est chargé en blocs avec une taille de bloc maximale de 4 Mio, que nous définissons avec la propriété blockSize.

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 BlockBlobParallelUploadOptions. Chaque sous-chargement a son propre appel dédié à l’opération REST. Dans cet exemple, l’opération est Placer un bloc. 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 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 des options de transfert de données pour les téléchargements est disponible uniquement lors de l’utilisation de la méthode downloadToBuffer. Cette méthode télécharge un blob en parallèle vers une mémoire tampon en fonction des valeurs définies dans BlobDownloadToBufferOptions. Les autres méthodes de téléchargement ne prennent pas en charge le réglage des options de transfert de données.

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

Vous pouvez régler les valeurs suivantes pour les téléchargements lors de l’utilisation de la méthode downloadToBuffer :

  • blockSize : taille de bloc maximale à transférer pour chaque demande.
  • concurrency : nombre maximal de demandes parallèles envoyées à un moment donné dans le cadre du même transfert parallèle.

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

Pendant un téléchargement via downloadToBuffer, les bibliothèques de client de Stockage divisent une requête de téléchargement donnée en plusieurs sous-téléchargements en fonction des options de configuration définies par BlobDownloadToBufferOptions. 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.

Exemple de code

L’exemple de code suivant montre comment définir des valeurs pour BlobDownloadToBufferOptions, puis ajouter les options dans le cadre d’un appel de méthode downloadToBuffer. Les valeurs fournies dans les exemples 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.

// Specify data transfer options
    const downloadToBufferOptions = {
        blockSize: 4 * 1024 * 1024, // 4 MiB max block size
        concurrency: 2, // maximum number of parallel transfer workers
    }

    // Download data to buffer
    const result = await client.downloadToBuffer(offset, count, downloadToBufferOptions);