Compartir por


Optimización del rendimiento para cargas y descargas con JavaScript

Cuando una aplicación transfiere datos mediante la biblioteca cliente de Azure Storage para JavaScript, hay varios factores que pueden afectar a la velocidad, al uso de memoria e incluso a la ejecución correcta o incorrecta de la solicitud. Para maximizar el rendimiento y la confiabilidad de las transferencias de datos, es importante ser proactivo en la configuración de las opciones de transferencia de la biblioteca cliente en función del entorno en el que se ejecuta la aplicación.

En este artículo se describen varias consideraciones para optimizar las opciones de transferencia de datos. Cuando se ajusta correctamente, la biblioteca cliente puede distribuir eficazmente los datos entre varias solicitudes, lo que puede dar lugar a mejorar la velocidad de operación, el uso de memoria y la estabilidad de la red.

Ajuste del rendimiento de los cargas

El ajuste correcto de las opciones de transferencia de datos es clave para obtener un rendimiento confiable para las cargas. Las transferencias de almacenamiento se dividen en varias subtransferencias en función de los valores de estos argumentos. El tamaño máximo de transferencia admitido varía según la operación y la versión del servicio, por lo que asegúrese de consultar la documentación para determinar los límites. Para más información sobre los límites de tamaño de transferencia para Blob Storage, consulte Objetivos de escalabilidad de Blob Storage.

Establecimiento de opciones de transferencia para cargas

Puede configurar las propiedades en BlockBlobParallelUploadOptions para mejorar el rendimiento de las operaciones de transferencia de datos. En la tabla siguiente se enumeran las propiedades que puede configurar, junto con una descripción:

Propiedad Descripción
blockSize Tamaño máximo de bloque que se va a transferir para cada solicitud como parte de una operación de carga. Para más información, consulte blockSize.
maxSingleShotSize Si el tamaño de los datos fuera menor o igual que este valor, se cargará en una sola colocación en lugar de dividirse en fragmentos. Si los datos se cargasen en una sola captura, se omitirá el tamaño del bloque. El valor predeterminado es 256 MB. Si personaliza esta propiedad, debe usar un valor menor o igual que 256 MB. Para más información, consulte maxSingleShotSize.
concurrency El número máximo de solicitudes paralelas que se emiten en cualquier momento dado como parte de una única transferencia paralela.

Nota:

Las bibliotecas cliente usarán los valores predeterminados para cada opción de transferencia de datos, si no se proporciona. Estos valores predeterminados suelen tener un buen rendimiento en un entorno de centro de datos, pero es probable que no sean adecuados para entornos de consumidores domésticos. Un ajuste deficiente de opciones de transferencia de datos puede dar lugar a operaciones excesivamente largas e incluso tiempos de espera de solicitud. Es mejor ser proactivo al probar los valores y ajustarlos en función de las necesidades de la aplicación y el entorno.

maxSingleShotSize

El valor maxSingleShotSize es el tamaño máximo de blob en bytes para una sola carga de solicitud.

Si el tamaño de los datos es menor o igual que maxSingleShotSize, el blob se carga con una sola solicitud Put Blob. Si el tamaño del blob es mayor que maxSingleShotSize, o si se desconoce el tamaño del blob, el blob se carga en fragmentos mediante una serie de llamadas Put Block seguidas de Put Block List.

Es importante tener en cuenta que el valor que especifique para blockSize no limite el valor que defina para maxSingleShotSize. El argumento maxSingleShotSize define una limitación de tamaño independiente para que una solicitud realice toda la operación a la vez, sin subtransfers. A menudo, se desea que maxSingleShotSize sea al menos tan grande como el valor que defina para blockSize, si no mayor. Este enfoque puede ser más eficaz en función del tamaño de la transferencia de datos, ya que la transferencia se completa con una única solicitud y evita la sobrecarga de varias solicitudes.

Si no está seguro de qué valor es mejor para su situación, una opción segura es establecer maxSingleShotSize en el mismo valor que se usa para blockSize.

blockSize

El valor blockSize es la longitud máxima de una transferencia en bytes al cargar un blob en bloques en fragmentos.

Como se mencionó anteriormente, este valor no limita a maxSingleShotSize, que puede ser mayor que blockSize.

Para que los datos se muevan de forma eficaz, es posible que las bibliotecas cliente no siempre alcancen el valor de blockSize en cada transferencia. En función de la operación, el valor máximo admitido para el tamaño de transferencia puede variar. Para más información sobre los límites de tamaño de transferencia para Blob Storage, consulte el gráfico en Objetivos de escalabilidad de Blob Storage.

Ejemplo de código

El siguiente ejemplo de código muestra cómo establecer valores para BlockBlobParallelUploadOptions e incluir las opciones como parte de una llamada al método de carga. Los valores proporcionados en las muestras no pretenden ser una recomendación. Para ajustar correctamente estos valores, debe tener en cuenta las necesidades específicas de la aplicación.

// 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);

En este ejemplo, establecemos el número máximo de trabajos de transferencia en paralelo en 2 mediante la propiedad concurrency. También se establece maxSingleShotSize en 8 MiB. Si el tamaño del blob es inferior a 8 MiB, solo se necesita una única solicitud para completar la operación de carga. Si el tamaño del blob es mayor que 8 MiB, se carga en fragmentos con un tamaño máximo de 4 MiB, que se establece mediante el método blockSize.

Consideraciones de rendimiento para las cargas

Durante una carga, las bibliotecas cliente de Storage dividen un flujo de carga determinado en varias subcargas en función de las opciones de configuración definidas por BlockBlobParallelUploadOptions. Cada carga secundaria tiene su propia llamada dedicada a la operación REST. En este ejemplo, la operación es Put Block. La biblioteca cliente de Storage administra estas operaciones REST en paralelo (según las opciones de transferencia) para llevar a cabo la carga completa.

Nota:

Los blobs en bloques tienen un número máximo de bloques de 50 000 bloques. El tamaño máximo del blob en bloques, por tanto, es de 50 000 veces block_size.

Almacenamiento en búfer durante las cargas

La capa REST de Storage no admite reanudar una operación de carga REST donde se dejó; las transferencias individuales se completan o se pierden. Para garantizar la resistencia de las cargas de flujos, las bibliotecas cliente de Storage almacenan en búfer los datos de cada llamada REST individual antes de iniciar la carga. Además de las limitaciones de velocidad de la red, este comportamiento de almacenamiento en búfer es una razón para considerar un valor más pequeño para blockSize, incluso cuando se carga en secuencia. Al disminuir el valor de blockSize, se reduce la cantidad máxima de datos que se almacenan en búfer en cada solicitud y cada reintento de una solicitud con errores. Si experimenta tiempos de espera frecuentes durante las transferencias de datos de un tamaño determinado, al reducir el valor de blockSize, se reduce el tiempo de almacenamiento en búfer y puede dar lugar a un mejor rendimiento.

Ajuste del rendimiento de las descargas

La optimización de las opciones de transferencia de datos para las descargas solo está disponible cuando se usa el método downloadToBuffer. Este método descarga un blob en paralelo a un búfer en función de los valores definidos en BlobDownloadToBufferOptions. Otros métodos de descarga no admiten la optimización de las opciones de transferencia de datos.

Establecimiento de opciones de transferencia para descargas

Los siguientes valores se pueden ajustar para las descargas cuando se usa el método downloadToBuffer:

  • blockSize: el tamaño máximo de bloque que se va a transferir para cada solicitud.
  • concurrency: el número máximo de solicitudes paralelas emitidas en un momento dado como parte de una única transferencia paralela.

Consideraciones de rendimiento para las descargas

Durante una descarga cib downloadToBuffer, las bibliotecas cliente de Storage dividen una descarga determinada en varias subdescargas en función de las opciones de configuración definidas por BlobDownloadToBufferOptions. Cada descarga secundaria tiene su propia llamada dedicada a la operación REST. En función de las opciones de transferencia, las bibliotecas cliente administran estas operaciones REST en paralelo para llevar a cabo la descarga completa.

Ejemplo de código

En el ejemplo de código siguiente, se muestra cómo establecer valores para BlobDownloadToBufferOptions e incluir las opciones como parte de una instancia de downloadToBuffer. Los valores proporcionados en las muestras no pretenden ser una recomendación. Para ajustar correctamente estos valores, debe tener en cuenta las necesidades específicas de la aplicación.

// 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);