Partilhar via


Ajuste de desempenho para uploads e downloads com o Go

Quando um aplicativo transfere dados usando a biblioteca de cliente do Armazenamento do Azure para Go, há vários fatores que podem afetar a velocidade, o uso de memória e até mesmo o sucesso ou falha da solicitação. Para maximizar o desempenho e a confiabilidade das transferências de dados, é importante ser proativo na configuração das opções de transferência da biblioteca do cliente com base no ambiente em que seu aplicativo é executado.

Este artigo apresenta várias considerações para ajustar as opções de transferência de dados. Quando ajustada corretamente, a biblioteca do cliente pode distribuir dados de forma eficiente entre várias solicitações, o que pode resultar em maior velocidade de operação, uso de memória e estabilidade de rede.

Ajuste de desempenho para uploads

Ajustar corretamente as opções de transferência de dados é a chave para um desempenho confiável para uploads. As transferências de armazenamento são particionadas em várias subtransferências com base nos valores dessas propriedades. O tamanho máximo de transferência suportado varia de acordo com a operação e a versão do serviço, portanto, certifique-se de verificar a documentação para determinar os limites. Para obter mais informações sobre limites de tamanho de transferência para armazenamento de Blob, consulte Dimensionar destinos para armazenamento de Blob.

Definir opções de transferência para carregamentos

Se o tamanho total do blob for menor ou igual a 256 MB, os dados serão carregados com uma única solicitação Put Blob . Se o tamanho do blob for maior que 256 MB, ou se o tamanho do blob for desconhecido, o blob será carregado em partes usando uma série de chamadas Put Block seguidas por Put Block List.

As seguintes propriedades podem ser configuradas e ajustadas com base nas necessidades do seu aplicativo:

  • BlockSize: O comprimento máximo de uma transferência em bytes ao carregar um blob de bloco em partes. O padrão é 4 MB.
  • Concurrency: O número máximo de subtransferências que podem ser utilizadas em paralelo. O padrão é 5.

Essas opções de configuração estão disponíveis ao carregar usando os seguintes métodos:

O método Upload não suporta essas opções e carrega dados em uma única solicitação.

Nota

As bibliotecas de cliente usam padrões para cada opção de transferência de dados, se não fornecidas. Esses padrões geralmente têm desempenho em um ambiente de data center, mas provavelmente não são adequados para ambientes de consumidores domésticos. Opções de transferência de dados mal ajustadas podem resultar em operações excessivamente longas e até mesmo tempos limite de solicitação. É melhor ser proativo ao testar esses valores e ajustá-los com base nas necessidades do seu aplicativo e ambiente.

Tamanho do bloco

O BlockSize argumento é o comprimento máximo de uma transferência em bytes ao carregar um blob de bloco em partes.

Para manter os dados em movimento de forma eficiente, as bibliotecas de cliente nem sempre atingem o BlockSize valor de cada transferência. Dependendo da operação, o valor máximo suportado para o tamanho da transferência pode variar. Para obter mais informações sobre limites de tamanho de transferência para armazenamento de Blob, consulte o gráfico em Dimensionar destinos para armazenamento de Blob.

Exemplo de código

O exemplo de código a seguir mostra como definir valores para uma instância UploadFileOptions e passar essas opções de configuração como um parâmetro para UploadFile.

Os valores fornecidos neste exemplo não pretendem ser uma recomendação. Para ajustar corretamente esses valores, você precisa considerar as necessidades específicas do seu aplicativo.

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

Neste exemplo, definimos o número de trabalhadores de transferência paralela como 2, usando o Concurrency campo. Esta configuração abre até duas conexões simultaneamente, permitindo que o upload aconteça em paralelo. Se o tamanho do blob for maior que 256 MB, o blob será carregado em blocos com um tamanho máximo de bloco de 8 MiB, conforme definido pelo Block_Size campo.

Considerações de desempenho para uploads

Durante um carregamento, as bibliotecas do cliente de armazenamento dividem um determinado fluxo de carregamento em vários subcarregamentos com base nas opções de configuração definidas durante a construção do cliente. Cada subupload tem sua própria chamada dedicada para a operação REST. A biblioteca do cliente de armazenamento gerencia essas operações REST em paralelo (dependendo das opções de transferência) para concluir o carregamento completo.

Você pode aprender como a biblioteca de cliente lida com o buffer nas seções a seguir.

Nota

Os blobs de bloco têm uma contagem máxima de blocos de 50.000 blocos. O tamanho máximo do blob de bloco, então, é de 50.000 vezes Block_Size.

Armazenamento em buffer durante carregamentos

A camada REST de armazenamento não suporta pegar uma operação de upload REST de onde você parou; As transferências individuais são concluídas ou perdidas. Para garantir a resiliência para uploads de fluxo, as bibliotecas do cliente de armazenamento armazenam em buffer dados para cada chamada REST individual antes de iniciar o carregamento. Além das limitações de velocidade da rede, esse comportamento de buffer é um motivo para considerar um valor menor para BlockSize, mesmo ao carregar em sequência. Diminuir o valor de BlockSize diminui a quantidade máxima de dados armazenados em buffer em cada solicitação e cada nova tentativa de uma solicitação com falha. Se você estiver enfrentando tempos limite frequentes durante transferências de dados de um determinado tamanho, reduzir o valor de reduz o tempo de BlockSize buffer e pode resultar em melhor desempenho.

Ajuste de desempenho para downloads

Ajustar corretamente as opções de transferência de dados é a chave para um desempenho confiável para downloads. As transferências de armazenamento são particionadas em várias subtransferências com base nos valores dessas propriedades.

Definir opções de transferência para downloads

As seguintes propriedades podem ser ajustadas com base nas necessidades do seu aplicativo:

  • BlockSize: O tamanho máximo de bloco usado para baixar um blob. O padrão é 4 MB.
  • Concurrency: O número máximo de subtransferências que podem ser utilizadas em paralelo. O padrão é 5.

Essas opções estão disponíveis ao fazer o download usando os seguintes métodos:

O método DownloadStream não suporta essas opções e baixa dados em uma única solicitação.

Exemplo de código

O exemplo de código a seguir mostra como definir valores para uma instância DownloadFileOptions e passar essas opções de configuração como um parâmetro para DownloadFile.

Os valores fornecidos neste exemplo não pretendem ser uma recomendação. Para ajustar corretamente esses valores, você precisa considerar as necessidades específicas do seu aplicativo.

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

Considerações de desempenho para downloads

Durante um download, as bibliotecas do cliente de armazenamento dividem uma determinada solicitação de download em vários subdownloads com base nas opções de configuração definidas durante a construção do cliente. Cada subdownload tem sua própria chamada dedicada para a operação REST. Dependendo das opções de transferência, as bibliotecas de cliente gerenciam essas operações REST em paralelo para concluir o download completo.