Compartir por


Optimización del rendimiento para cargas y descargas con Go

Cuando una aplicación transfiere datos mediante la biblioteca cliente de Azure Storage para Go, 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 estas propiedades. 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

Si el tamaño total del blob es menor o igual que 256 MB, los datos se cargan con una única solicitud de Put Blob. Si el tamaño del blob es mayor que 256 MB, o si el tamaño del blob es desconocido, el blob se carga en fragmentos mediante una serie de llamadas Put Block seguidas de Put Block List.

Las siguientes propiedades se pueden configurar y ajustar en función de las necesidades de la aplicación:

  • BlockSize: la longitud máxima de una transferencia en bytes al cargar un blob en bloques en fragmentos. El valor predeterminado es 4 MB.
  • Concurrency: número máximo de subtransferencias que se pueden usar en paralelo. El valor predeterminado es 5.

Estas opciones de configuración están disponibles al cargar mediante los métodos siguientes:

El método Upload no admite estas opciones y carga datos en una sola solicitud.

Nota:

Las bibliotecas cliente usan 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.

BlockSize

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

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

En el ejemplo de código siguiente se muestra cómo definir valores para una instancia de UploadFileOptions y pasar estas opciones de configuración como parámetro para UploadFile.

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.

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

En este ejemplo, establecemos el número de trabajos de transferencia en paralelo en 2 mediante el campo Concurrency. Esta configuración abre hasta dos conexiones simultáneamente, lo que permite que la carga se produzca en paralelo. Si el tamaño del blob es mayor que 256 MB, el blob se carga en fragmentos con un tamaño máximo de 8 MiB, tal como lo establece el campo Block_Size.

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 durante la construcción del cliente. Cada carga secundaria tiene su propia llamada dedicada a la operación REST. La biblioteca cliente de Storage administra estas operaciones REST en paralelo (según las opciones de transferencia) para llevar a cabo la carga completa.

Puede obtener información sobre cómo la biblioteca cliente controla el almacenamiento en búfer en las secciones siguientes.

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 de estas propiedades.

Establecimiento de opciones de transferencia para descargas

Se pueden ajustar las siguientes propiedades en función de las necesidades de la aplicación:

  • BlockSize: tamaño máximo de fragmento que se usa para descargar un blob. El valor predeterminado es 4 MB.
  • Concurrency: número máximo de subtransferencias que se pueden usar en paralelo. El valor predeterminado es 5.

Estas opciones están disponibles al descargar mediante los métodos siguientes:

El método DownloadStream no admite estas opciones y descarga datos en una sola solicitud.

Ejemplo de código

En el ejemplo de código siguiente se muestra cómo definir valores para una instancia de DownloadFileOptions y pasar estas opciones de configuración como parámetro para DownloadFile.

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.

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

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 durante la construcción del cliente. 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.