Avaliar a capacidade provisionada para o provisionamento do tamanho certo de uma tabela do DynamoDB - Amazon DynamoDB

Avaliar a capacidade provisionada para o provisionamento do tamanho certo de uma tabela do DynamoDB

Esta seção apresenta uma visão geral de como avaliar o provisionamento adequado para a tabela do DynamoDB. À medida que sua workload evolui, você deve modificar seus procedimentos operacionais adequadamente, especialmente quando sua tabela do DynamoDB está configurada no modo provisionado e você corre o risco de provisionar demais ou subprovisionar suas tabelas.

Os procedimentos descritos abaixo exigem informações estatísticas que devem ser capturadas das tabelas do DynamoDB que oferecem suporte à sua aplicação de produção. Para entender o comportamento da sua aplicação, você deve definir um período de tempo significativo o suficiente para capturar a sazonalidade dos dados da aplicação. Por exemplo, se a aplicação mostrar padrões semanais, usar um período de três semanas deve fornecer espaço suficiente para analisar as necessidades de throughput da aplicação.

Se não souber por onde começar, use pelo menos um mês de uso de dados para os cálculos abaixo.

Ao avaliar a capacidade, as tabelas do DynamoDB podem configurar unidades de capacidade de leitura (RCUs) e unidades de capacidade de gravação (WCU) de forma independente. Se as suas tabelas tiverem algum Índice Secundário Global (GSI) configurado, você deverá especificar o throughput que ela consumirá, que também será independente das RCUs e WCUs da tabela-base.

nota

Os índices secundários locais (LSI) consomem a capacidade da tabela-base.

Como recuperar métricas de consumo em suas tabelas do DynamoDB

Para avaliar a tabela e a capacidade do GSI, monitore as seguintes métricas do CloudWatch e selecione a dimensão apropriada para recuperar as informações da tabela ou do GSI:

Unidades de capacidade de leitura Unidades de capacidade de gravação

ConsumedReadCapacityUnits

ConsumedWriteCapacityUnits

ProvisionedReadCapacityUnits

ProvisionedWriteCapacityUnits

ReadThrottleEvents

WriteThrottleEvents

Você pode fazer isso por meio da AWS CLI ou do AWS Management Console.

AWS CLI

Antes de recuperarmos as métricas de consumo da tabela, precisaremos começar capturando alguns pontos de dados históricos usando a API do CloudWatch.

Comece criando dois arquivos:write-calc.json e read-calc.json. Esses arquivos representarão os cálculos de uma tabela ou GSI. Você deverá atualizar alguns dos campos, conforme indicado na tabela abaixo, para corresponder ao seu ambiente.

Nome do campo Definição Exemplo
<table-name> Nome da tabela que você analisará SampleTable
<period> O período de tempo que você usará para avaliar a utilização prevista, com base em segundos Por um período de uma hora, você deve especificar: 3600
<start-time> O início do seu intervalo de avaliação, especificado no formato ISO8601 2022-02-21T23:00:00
<end-time> O final do intervalo de avaliação, especificado no formato ISO8601 2022-02-22T06:00:00

O arquivo de cálculos de gravação recuperará o número de WCU provisionado e consumido no período de tempo para o intervalo de datas especificado. Também gerará uma porcentagem de utilização que será usada para análise. O conteúdo completo do arquivo write-calc.json deve ser semelhante a este:

{ "MetricDataQueries": [ { "Id": "provisionedWCU", "MetricStat": { "Metric": { "Namespace": "AWS/DynamoDB", "MetricName": "ProvisionedWriteCapacityUnits", "Dimensions": [ { "Name": "TableName", "Value": "<table-name>" } ] }, "Period": <period>, "Stat": "Average" }, "Label": "Provisioned", "ReturnData": false }, { "Id": "consumedWCU", "MetricStat": { "Metric": { "Namespace": "AWS/DynamoDB", "MetricName": "ConsumedWriteCapacityUnits", "Dimensions": [ { "Name": "TableName", "Value": "<table-name>"" } ] }, "Period": <period>, "Stat": "Sum" }, "Label": "", "ReturnData": false }, { "Id": "m1", "Expression": "consumedWCU/PERIOD(consumedWCU)", "Label": "Consumed WCUs", "ReturnData": false }, { "Id": "utilizationPercentage", "Expression": "100*(m1/provisionedWCU)", "Label": "Utilization Percentage", "ReturnData": true } ], "StartTime": "<start-time>", "EndTime": "<ent-time>", "ScanBy": "TimestampDescending", "MaxDatapoints": 24 }

O arquivo de cálculos de leitura usa um arquivo semelhante. Esse arquivo recuperará quantas RCUs foram provisionadas e consumidas durante o período para o intervalo de datas especificado. O conteúdo do arquivo read-calc.json deve ser semelhante a este:

{ "MetricDataQueries": [ { "Id": "provisionedRCU", "MetricStat": { "Metric": { "Namespace": "AWS/DynamoDB", "MetricName": "ProvisionedReadCapacityUnits", "Dimensions": [ { "Name": "TableName", "Value": "<table-name>" } ] }, "Period": <period>, "Stat": "Average" }, "Label": "Provisioned", "ReturnData": false }, { "Id": "consumedRCU", "MetricStat": { "Metric": { "Namespace": "AWS/DynamoDB", "MetricName": "ConsumedReadCapacityUnits", "Dimensions": [ { "Name": "TableName", "Value": "<table-name>" } ] }, "Period": <period>, "Stat": "Sum" }, "Label": "", "ReturnData": false }, { "Id": "m1", "Expression": "consumedRCU/PERIOD(consumedRCU)", "Label": "Consumed RCUs", "ReturnData": false }, { "Id": "utilizationPercentage", "Expression": "100*(m1/provisionedRCU)", "Label": "Utilization Percentage", "ReturnData": true } ], "StartTime": "<start-time>", "EndTime": "<end-time>", "ScanBy": "TimestampDescending", "MaxDatapoints": 24 }

Depois de criar os arquivos, você poderá começar a recuperar os dados de utilização.

  1. Para recuperar dados de utilização de gravação, emita o seguinte comando:

    aws cloudwatch get-metric-data --cli-input-json file://write-calc.json
  2. Para recuperar dados de utilização de leitura, emita o seguinte comando:

    aws cloudwatch get-metric-data --cli-input-json file://read-calc.json

O resultado de ambas as consultas será uma série de pontos de dados no formato JSON que serão usados para análise. Seu resultado dependerá do número de pontos de dados que você especificou, do período e de seus próprios dados específicos da workload. Isso pode ser semelhante a:

{ "MetricDataResults": [ { "Id": "utilizationPercentage", "Label": "Utilization Percentage", "Timestamps": [ "2022-02-22T05:00:00+00:00", "2022-02-22T04:00:00+00:00", "2022-02-22T03:00:00+00:00", "2022-02-22T02:00:00+00:00", "2022-02-22T01:00:00+00:00", "2022-02-22T00:00:00+00:00", "2022-02-21T23:00:00+00:00" ], "Values": [ 91.55364583333333, 55.066631944444445, 2.6114930555555556, 24.9496875, 40.94725694444445, 25.61819444444444, 0.0 ], "StatusCode": "Complete" } ], "Messages": [] }
nota

Se você especificar um período curto e um longo intervalo de tempo, talvez seja necessário modificar o MaxDatapoints que, por padrão, está definido como 24 no script. Isso representa um ponto de dados por hora e 24 por dia.

AWS Management Console
  1. Faça login no AWS Management Console e acesse a página do serviço CloudWatch. Selecione uma Região da AWS adequada, se necessário.

  2. Localize a seção Métricas na barra de navegação à esquerda e selecione Todas as métricas.

  3. Isso abrirá um painel com dois painéis. O painel superior mostrará o gráfico e o painel inferior apresentará as métricas que você deseja plotar. Escolha DynamoDB.

  4. Selecione Métricas de tabela. Isso mostrará as tabelas em sua região atual.

  5. Use a caixa de pesquisa para pesquisar o nome da tabela e escolher as métricas da operação de gravação: ConsumedWriteCapacityUnits e ProvisionedWriteCapacityUnits.

    nota

    Este exemplo fala sobre métricas da operação de gravação, mas você também pode usar essas etapas para representar graficamente as métricas da operação de leitura.

  6. Selecione a guia Métricas em gráfico (2) para modificar as fórmulas. Por padrão, o CloudWatch seleciona a função estatística Média para os gráficos.

    As métricas plotadas selecionadas e a Média como função estatística padrão.
  7. Com as duas métricas em gráfico selecionadas (a caixa de seleção à esquerda), selecione o menu Add math (Adicionar matemática), seguido por Common (Comum), e selecione a função Percentage (Porcentagem). Repita o procedimento duas vezes.

    Primeira vez selecionando a função Percentage (Porcentagem):

    Console do CloudWatch. A função Porcentagem é selecionada para as métricas representadas graficamente.

    Pela segunda vez, selecionando a função Percentage (Porcentagem):

    Console do CloudWatch. A função Porcentagem é selecionada uma segunda vez para as métricas representadas graficamente.
  8. Nesse ponto, você deve ter quatro métricas no menu inferior. Vamos trabalhar no cálculo de ConsumedWriteCapacityUnits. Para sermos consistentes, precisamos combinar os nomes dos que usamos na seção da AWS CLI. Clique no ID m1 e altere esse valor para consumedWCU.

    Console do CloudWatch. A métrica representada graficamente com o ID m1 é renomeada para consumedWCU.

    Renomeie o rótulo ConsumedWriteCapacityUnit como consumedWCU.

    A métrica representada graficamente com o rótulo ConsumedWriteCapacityUnit foi renomeada para consumedWCU.
  9. Altere a estatística de Average (Média) para Sum (Soma). Essa ação criará automaticamente outra métrica chamada ANOMALY_DETECTION_BAND. Para saber o escopo desse procedimento, vamos ignorá-lo removendo a caixa de seleção na métrica ad1 recém-gerada.

    Console do CloudWatch. A estatística SUM é selecionada na lista suspensa para as métricas representadas graficamente.
    Console do CloudWatch. A métrica ANOMALY_DETECTION_BAND foi removida da lista de métricas representadas graficamente.
  10. Repita a etapa 8 para renomear o ID m2 como provisionedWCU. Deixe a estatística definida como Average (Média).

    Console do CloudWatch. A métrica representada graficamente com o ID m2 é renomeada para provisionedWCU.
  11. Selecione o rótulo Expression1 e atualize o valor para m1 e o rótulo para Consumed WCUs (WCUs consumidas).

    nota

    Certifique-se de ter selecionado somente m1 (caixa de seleção à esquerda) e provisionedWCU para visualizar corretamente os dados. Atualize a fórmula clicando em Details (Detalhes) e alterando a fórmula para consumedWCU/PERIOD(consumedWCU). Essa etapa também pode gerar outra métrica ANOMALY_DETECTION_BAND, mas, para o escopo desse procedimento, podemos ignorá-la.

    m1 e provisionedWCU estão selecionados. Os detalhes de m1 são atualizados como consumedWCU/PERIOD(consumedWCU).
  12. Agora você deve ter dois gráficos: um que indica suas WCUs provisionadas na tabela e outro que indica as WCUs consumidas. A forma do gráfico pode ser diferente da figura abaixo, mas você pode usá-lo como referência:

    Grafo com as WCUs provisionadas e as WCUs consumidas para a tabela traçada.
  13. Atualize a fórmula de porcentagem selecionando o gráfico Expression2 (e2). Renomeie os rótulos e IDs para utilizationPercentage. Renomeie a fórmula para corresponder a 100*(m1/provisionedWCU).

    Console do CloudWatch. Os rótulos e os IDs da Expression2 são renomeados para utilizationPercentage.
    Console do CloudWatch. A fórmula percentual para Expression2 foi atualizada para 100* (m1/provisionedWCU).
  14. Remova a caixa de seleção de todas as métricas, exceto utilizationPercentage, para visualizar seus padrões de utilização. O intervalo padrão é definido como um minuto, mas fique à vontade para modificá-lo conforme necessário.

    Grafo da métrica utilizationPercentage para o intervalo de tempo selecionado.

Aqui está uma visão de um longo período de tempo, bem como de um período maior que uma hora. É possível ver que há alguns intervalos em que a utilização foi superior a 100%, mas essa workload específica tem intervalos mais longos com zero utilização.

Padrão de utilização por um período estendido. Ele destaca períodos de utilização acima de 100% e zero.

Nesse momento, você pode ter resultados diferentes das imagens deste exemplo. Tudo depende dos dados da sua workload. Intervalos com mais de 100% de utilização estão sujeitos a eventos de controle de utilização. O DynamoDB oferece capacidade de expansão, mas assim que a capacidade de expansão for concluída, qualquer coisa acima de 100% terá controle de utilização.

Como identificar tabelas do DynamoDB subprovisionadas

Para a maioria das workloads, uma tabela é considerada subprovisionada quando consome constantemente mais de 80% de sua capacidade provisionada.

A capacidade de expansão é um recurso do DynamoDB que permite que os clientes consumam temporariamente mais RCUS/WCUs do que o provisionado originalmente (mais do que o throughput provisionado por segundo definido na tabela). A capacidade de expansão foi criada para absorver aumentos repentinos no tráfego devido a eventos especiais ou picos de uso. Essa capacidade de expansão não dura para sempre. Assim que as RCUs e WCUs não utilizadas forem esgotadas, você terá controle de utilização se tentar consumir mais capacidade do que a provisionada. Quando o tráfego do sua aplicação está se aproximando da taxa de utilização de 80%, o risco de controle de utilização é significativamente maior.

A regra da taxa de utilização de 80% varia com a sazonalidade de seus dados e com o crescimento do tráfego. Considere os seguintes cenários:

  • Se o seu tráfego se manteve estável com uma taxa de utilização de ~90% nos últimos 12 meses, sua tabela tem a capacidade certa

  • Se o tráfego da sua aplicação estiver crescendo a uma taxa de 8% ao mês em menos de 3 meses, você chegará a 100%

  • Se o tráfego da sua aplicação estiver crescendo a uma taxa de 5% em pouco mais de 4 meses, você ainda chegará a 100%

Os resultados das consultas acima fornecem uma imagem da sua taxa de utilização. Use-os como um guia para avaliar melhor outras métricas que podem ajudar você a escolher aumentar a capacidade da tabela conforme necessário (por exemplo: uma taxa de crescimento mensal ou semanal). Trabalhe com sua equipe de operações para definir qual é uma boa porcentagem para sua workload e suas tabelas.

Há cenários especiais em que os dados são distorcidos quando os analisamos diariamente ou semanalmente. Por exemplo, com aplicações sazonais que têm picos de uso durante o horário comercial (mas depois caem para quase zero fora do horário comercial), é possível se beneficiar do ajuste de escala automático programado, em que você especifica as horas do dia (e os dias da semana) para aumentar a capacidade provisionada e quando reduzi-la. Em vez de buscar maior capacidade para cobrir as horas de pico, também é possível se beneficiar das configurações de ajuste de escala automático de tabelas do DynamoDB se a sua sazonalidade for menos acentuada.

nota

Ao criar uma configuração de Auto Scaling do DynamoDB para sua tabela-base, lembre-se de incluir outra configuração para qualquer GSI associado à tabela.

Como identificar tabelas superprovisionadas do DynamoDB

Os resultados da consulta obtidos dos scripts acima fornecem os pontos de dados necessários para realizar algumas análises iniciais. Se o seu conjunto de dados apresentar valores inferiores a 20% de utilização em vários intervalos, sua tabela pode estar superprovisionada. Para definir melhor se você precisa reduzir o número de WCUs e RCUS, revise as outras leituras nos intervalos.

Quando suas tabelas contêm vários intervalos de uso baixos, é possível se beneficiar do uso de políticas de ajuste de escala automático, seja programando o ajuste de escala automático ou simplesmente configurando as políticas de ajuste de escala automático padrão para a tabela, com base na utilização.

Se você tem uma workload com baixa utilização e alta taxa de controle de utilização (Max(ThrottleEvents)/Min(ThrottleEvents) no intervalo), isso pode acontecer quando você tem uma workload com muitos picos, em que o tráfego aumenta muito durante alguns dias (ou horas), mas, em geral, o tráfego é consistentemente baixo. Nesses cenários, pode ser benéfico usar o ajuste de escala automático programado.