Compartir a través de


Optimización del rendimiento para cargas y descargas con Java

Cuando una aplicación transfiere datos mediante la biblioteca cliente de Azure Storage para Java, 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 los valores en ParallelTransferOptions para mejorar el rendimiento de las operaciones de transferencia de datos. Los siguientes valores se pueden ajustar para cargas según las necesidades de su aplicación:

  • maxSingleUploadSize: el tamaño máximo de blob en bytes para una sola carga de solicitud.
  • blockSize: el tamaño máximo de bloque que se va a transferir para cada solicitud.
  • maxConcurrency: el número máximo de solicitudes paralelas emitidas en un 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.

maxSingleUploadSize

El valor maxSingleUploadSize es el tamaño máximo de blob en bytes para una sola carga de solicitud. Este valor se puede establecer mediante el método siguiente:

Si el tamaño de los datos es menor o igual que maxSingleUploadSize, el blob se carga con una sola solicitud Put Blob. Si el tamaño del blob es mayor que maxSingleUploadSize, 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 maxSingleUploadSize. El argumento maxSingleUploadSize 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 maxSingleUploadSize 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 maxSingleUploadSize 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. Este valor se puede establecer mediante el método siguiente:

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 maxSingleUploadSize, 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.

maxConcurrency

El valor de maxConcurrency es el número máximo de solicitudes paralelas emitidas en cualquier momento dado como parte de una única transferencia paralela. Este valor se puede establecer mediante el método siguiente:

Ejemplo de código

Asegúrese de tener la siguiente directiva import para usar ParallelTransferOptions para una carga:

import com.azure.storage.blob.models.*;

En el ejemplo de código siguiente, se muestra cómo establecer valores para ParallelTransferOptions e incluir las opciones como parte de una instancia de BlobUploadFromFileOptions. Si no carga desde un archivo, podrá establecer opciones similares mediante BlobParallelUploadOptions. Los valores proporcionados en este ejemplo no están diseñados para ser una recomendación. Para ajustar correctamente estos valores, debe tener en cuenta las necesidades específicas de la aplicación.

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

En este ejemplo, establecemos el número máximo de trabajos de transferencia en paralelo en 2 mediante la propiedad setMaxConcurrency. También establecemos maxSingleUploadSize en 8 MiB mediante el método setMaxSingleUploadSizeLong. 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 setBlockSizeLong.

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 ParallelTransferOptions. Cada carga secundaria tiene su propia llamada dedicada a la operación REST. Para un objeto BlobClient, esta 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

El ajuste correcto de las opciones de transferencia de datos es clave para obtener un rendimiento confiable para las descargas. Las transferencias de almacenamiento se dividen en varias subtransferencias en función de los valores definidos en ParallelTransferOptions.

Establecimiento de opciones de transferencia para descargas

Los siguientes valores se pueden ajustar para descargas según las necesidades de su aplicación:

  • blockSize: el tamaño máximo de bloque a transferir para cada solicitud. Puede establecer este valor utilizando el método setBlockSizeLong.
  • maxConcurrency: el número máximo de solicitudes paralelas emitidas en un momento dado como parte de una única transferencia paralela. Puede establecer este valor utilizando el método setMaxConcurrency.

Ejemplo de código

Asegúrese de tener la siguiente directiva import para usar ParallelTransferOptions para una descarga:

import com.azure.storage.common.*;

En el ejemplo de código siguiente, se muestra cómo establecer valores para ParallelTransferOptions e incluir las opciones como parte de una instancia de 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);

Consideraciones de rendimiento para las descargas

Durante una descarga, las bibliotecas cliente de Storage dividen una descarga determinada en varias subdescargas en función de las opciones de configuración definidas por ParallelTransferOptions. 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.

Pasos siguientes