Como o AWS DMS usa memória para migração?

Data da última atualização: 18/8/2022

Eu tenho uma tarefa do AWS Database Migration Service (AWS DMS) que está usando mais ou menos memória do que o esperado. Como o AWS DMS usa memória para migração e como posso otimizar o uso de memória da minha instância de replicação?

Breve descrição

Uma instância de replicação do AWS DMS usa memória para executar o mecanismo de replicação. Esse mecanismo é responsável por executar instruções SELECT no mecanismo de origem durante a fase de carga total. Além disso, o mecanismo de replicação lê o registro de transações do mecanismo de origem durante a fase de change data capture (CDC – captura de dados de alteração). Esses registros são migrados para o destino e, em seguida, comparados com os registros correspondentes no banco de dados de destino como parte do processo de validação. É assim que o fluxo de migração genérico funciona no AWS DMS.

O AWS DMS também usa memória para a configuração de tarefas e para o fluxo de dados da origem para o destino.

Resolução

Tarefas com configurações de LOB limitadas

Quando você migra dados usando uma tarefa do AWS DMS com configurações limitadas de large binary objects (LOB – objetos binários grandes), a memória é alocada antecipadamente com base no LobMaxSize para cada coluna LOB. Se você definir esse valor muito alto, sua tarefa poderá falhar. Essa falha ocorre devido a um erro de out of memory (OOM – falta de memória), dependendo do número de registros que você estiver migrando e do CommitRate.

Portanto, se você configurar sua tarefa com valores altos, verifique se a instância do AWS DMS tem memória suficiente.

{
  "TargetMetadata": {
  "SupportLobs": true,
  "FullLobMode": false,
  "LobChunkSize": 0,
  "LimitedSizeLobMode": true,
  "LobMaxSize": 63,
  "InlineLobMaxSize": 0,
  }

Tarefas com ValidationEnabled

Ao migrar usando uma tarefa do AWS DMS que tem ValidationEnabled=true, você pode ver um uso adicional de memória. Isso acontece porque o AWS DMS recupera registros ThreadCount * PartitionSize dos bancos de dados de origem e de destino. Em seguida, ele compara os dados correspondentes na instância de replicação. Então, você observa o uso adicional de memória na instância de replicação, no banco de dados de origem e no banco de dados de destino durante a migração.

Para limitar a quantidade de memória em uso, ignore as colunas LOB usando SkipLobColums. Você também pode realizar a validação separadamente da tarefa de migração usando uma instância de replicação separada ou uma tarefa do AWS DMS. Para fazer isso, use a configuração ValidationOnly:

"ValidationSettings": {
  "EnableValidation": true,
  "ThreadCount": 5,
  "PartitionSize": 10000,
  "ValidationOnly": false,
  "SkipLobColumns": false,
  },

Para obter mais informações, consulte Validação de dados do AWS DMS.

Tarefas com threads paralelas nas fases de carga total e CDC

Quando você usa um destino não RDBMS, o ParallelLoadThreads * ParallelLoadBufferSize determina o número de threads e o tamanho da transferência de dados para o destino. Da mesma forma, o ParallelApplyThreads * ParallelApplyBufferSize determina o número de threads e o tamanho da transferência de dados durante a fase CDC. O AWS DMS mantém os dados extraídos da origem em ParallelLoadQueuesPerThread e ParallelApplyQueuesPerThread. Ao ajustar essas configurações, verifique se a instância e o destino do AWS DMS têm a capacidade de lidar com a workload.

{
  "TargetMetadata": {
    "ParallelLoadThreads": 0,
    "ParallelLoadBufferSize": 0,
    "ParallelLoadQueuesPerThread": 0,
    "ParallelApplyThreads": 0,
    "ParallelApplyBufferSize": 0,
    "ParallelApplyQueuesPerThread": 0
  },

Para obter mais informações sobre essas configurações, consulte as Configurações da tarefa de metadados de destino.

Tarefas com configurações de aplicação em lote

Ao usar uma tarefa do AWS DMS com configurações de aplicação em lote, use estas práticas recomendadas:

  • A configuração de lote padrão é sempre suficiente para lidar com a workload normal. No processo em lote, o tamanho do lote e a frequência com que ele é aplicado no destino são determinados pelas configurações BatchApplyTimeoutMin, BatchApplyTimeoutMax e BatchApplyMemoryLimit. Essas configurações funcionam juntas para aplicar alterações em lote. Se você precisar ajustar essas configurações devido a workload pesada na origem, certifique-se de que a instância do AWS DMS tenha memória suficiente. Caso contrário, poderá ocorrer um erro de OOM.
  • Não defina BatchApplyMemoryLimit para mais do que o tamanho da memória da instância de replicação, ou poderá ocorrer um erro de OOM. Preste atenção em outras tarefas executadas simultaneamente com a tarefa do AWS DMS que você estiver usando para a migração quando definir BatchApplyMemoryLimit.
  • As transações de longa duração serão retidas na memória se BatchApplyPreserveTransaction for verdadeira em vários lotes. Isso também pode causar erros de OOM, dependendo das configurações de memória da próxima seção.
  • Use a configuração BatchSplitSize para definir o número de alterações a serem incluídas em cada lote e para limitar o consumo de memória:
{
  "TargetMetadata": {
    "BatchApplyEnabled": false,
  },
},
  "ChangeProcessingTuning": {
    "BatchApplyPreserveTransaction": true,
    "BatchApplyTimeoutMin": 1,
    "BatchApplyTimeoutMax": 30,
    "BatchApplyMemoryLimit": 500,
    "BatchSplitSize": 0,
  },

Para obter mais informações sobre como usar o modo de aplicação em lote, consulte Alterar configurações de ajuste de processamento.

  • Durante o CDC, o MinTransactionSize determina quantas alterações acontecem em cada transação. O tamanho das transações na instância de replicação é controlado por MemorylimitTotal. Use essa configuração ao executar várias tarefas do CDC que precisam de muita memória. Certifique-se de distribuir essa configuração com base na workload transacional de cada tarefa.
  • Defina MemoryKeepTime para limitar a memória consumida por transações de longa duração na origem. Ou, se um lote grande de instruções INSERT ou UPDATE estiver sendo executado na fonte, aumente esse tempo. Aumente esse tempo para impedir que as alterações sejam processadas na tabela de alterações líquidas.
  • Defina StatementCacheSize para controlar o número de instruções preparadas que são armazenadas na instância de replicação.
  • Se a instância de replicação do AWS DMS contiver um grande volume de memória livre, ajuste as configurações neste exemplo. Isso significa que o AWS DMS lida com a workload na própria memória, em vez de liberar frequentemente para o armazenamento do AWS DMS.

"ChangeProcessingTuning": {
    "MinTransactionSize": 1000,
    "CommitTimeout": 1,
    "MemoryLimitTotal": 1024,
    "MemoryKeepTime":
  60,
    "StatementCacheSize": 50
  },

Para obter mais informações sobre essas configurações, consulte Alterar configurações de ajuste de processamento.

Monitore o uso de memória de sua instância de replicação

Há várias maneiras de monitorar o uso de memória da sua instância de replicação. Para isolar a única tarefa que está consumindo mais memória, classifique suas tarefas por MemoryUsage. Para saber por que a tarefa está mantendo memória, compare CDCChangesMemorySource e CDCChangesMemoryTarget e solucione o problema do respectivo endpoint.

A própria instância de replicação usa o mínimo de memória para executar o mecanismo de replicação. Para verificar se tarefas adicionais do AWS DMS podem ser executadas na instância de replicação, revise a métrica AvailableMemory no Amazon CloudWatch. Em seguida, crie uma nova tarefa para usar a quantidade de FreeMemory disponível. Ao executar a tarefa do AWS DMS, monitore FreeMemory e SwapUsage para ver se a contenção de recursos é uma preocupação. Para obter mais informações, consulte Métricas de instância de replicação.

Evite problemas de memória

Para avaliar a quantidade de memória que a tarefa do AWS DMS está usando, teste uma instância com a mesma configuração em um ambiente inferior (desenvolvimento e preparação).

Além disso, realize uma migração de prova de conceito antes de trabalhar com dados de produção.