Ajuste de desempenho para uploads e downloads com Java

Quando um aplicativo transfere dados usando a biblioteca de cliente do Armazenamento do Azure para Java, 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 desses argumentos. 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

Você pode configurar os valores em ParallelTransferOptions para melhorar o desempenho das operações de transferência de dados. Os seguintes valores podem ser ajustados para carregamentos com base nas necessidades do seu aplicativo:

  • maxSingleUploadSize: O tamanho máximo de blob em bytes para um único carregamento de solicitação.
  • blockSize: O tamanho máximo do bloco a ser transferido para cada solicitação.
  • maxConcurrency: O número máximo de solicitações paralelas emitidas a qualquer momento como parte de uma única transferência paralela.

Nota

As bibliotecas de cliente usarão padrões para cada opção de transferência de dados, se não forem 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.

maxSingleUploadSize

O maxSingleUploadSize valor é o tamanho máximo de blob em bytes para um único carregamento de solicitação. Esse valor pode ser definido usando o seguinte método:

Se o tamanho dos dados for menor ou igual a maxSingleUploadSize, o blob será carregado com uma única solicitação Put Blob . Se o tamanho do blob for maior que maxSingleUploadSize, 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.

É importante observar que o valor especificado para blockSize não limita o valor definido para maxSingleUploadSize. O maxSingleUploadSize argumento define uma limitação de tamanho separada para uma solicitação para executar toda a operação de uma só vez, sem subtransferências. Muitas vezes, você quer maxSingleUploadSize ser pelo menos tão grande quanto o valor definido para blockSize, se não maior. Dependendo do tamanho da transferência de dados, essa abordagem pode ser mais eficiente, pois a transferência é concluída com uma única solicitação e evita a sobrecarga de várias solicitações.

Se você não tiver certeza de qual valor é melhor para sua situação, uma opção segura é definir maxSingleUploadSize para o mesmo valor usado para blockSize.

tamanho do bloco

O blockSize valor é o comprimento máximo de uma transferência em bytes ao carregar um blob de bloco em partes. Esse valor pode ser definido usando o seguinte método:

O blockSize valor é o comprimento máximo de uma transferência em bytes ao carregar um blob de bloco em partes. Como mencionado anteriormente, este valor não limita maxSingleUploadSize, que pode ser maior do que blockSize.

Para manter os dados em movimento de forma eficiente, as bibliotecas de cliente nem sempre atingem o valor de blockSize 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.

maxSimultaneidade

O maxConcurrency valor é o número máximo de solicitações paralelas emitidas em um determinado momento como parte de uma única transferência paralela. Esse valor pode ser definido usando o seguinte método:

Exemplo de código

Certifique-se de que tem a seguinte import diretiva para utilizar ParallelTransferOptions num carregamento:

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

O exemplo de código a seguir mostra como definir valores para ParallelTransferOptions e incluir as opções como parte de uma instância BlobUploadFromFileOptions . Se você não estiver carregando de um arquivo, poderá definir opções semelhantes usando BlobParallelUploadOptions. 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.

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

Neste exemplo, definimos o número máximo de trabalhadores de transferência paralela como 2 usando o setMaxConcurrency método. Também definimos maxSingleUploadSize para 8 MiB usando o setMaxSingleUploadSizeLong método. Se o tamanho do blob for menor que 8 MiB, apenas uma única solicitação será necessária para concluir a operação de upload. Se o tamanho do blob for maior que 8 MiB, o blob será carregado em pedaços com um tamanho máximo de bloco de 4 MiB, que definimos usando o setBlockSizeLong método.

Considerações de desempenho para uploads

Durante um upload, as bibliotecas de cliente de armazenamento dividem um determinado fluxo de upload em vários subcarregamentos com base nas opções de configuração definidas pelo ParallelTransferOptions. Cada subupload tem sua própria chamada dedicada para a operação REST. Para um BlobClient objeto, esta operação é Put Block. 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.

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 definidos em ParallelTransferOptions.

Definir opções de transferência para downloads

Os seguintes valores podem ser ajustados para downloads com base nas necessidades do seu aplicativo:

  • blockSize: O tamanho máximo do bloco a ser transferido para cada solicitação. Você pode definir esse valor usando o método setBlockSizeLong .
  • maxConcurrency: O número máximo de pedidos paralelos emitidos num determinado momento como parte de uma única transferência paralela. Você pode definir esse valor usando o método setMaxConcurrency .

Exemplo de código

Certifique-se de que tem a seguinte import diretiva para utilizar ParallelTransferOptions numa transferência:

import com.azure.storage.common.*;

O exemplo de código a seguir mostra como definir valores para ParallelTransferOptions e incluir as opções como parte de uma instância 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);

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 pelo ParallelTransferOptions. 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.

Próximos passos