¿Cómo usa AWS DMS la memoria para la migración?

Última actualización 18-08-2022

Tengo una tarea de AWS Database Migration Service (AWS DMS) que utiliza más o menos memoria de la esperada. ¿Cómo usa AWS DMS la memoria para la migración y cómo puedo optimizar el uso de memoria de mi instancia de replicación?

Descripción corta

Una instancia de replicación de AWS DMS usa memoria para ejecutar el motor de replicación. Este motor es responsable de ejecutar las instrucciones SELECT en el motor de origen durante la fase de carga completa. Además, el motor de replicación lee el registro de transacciones del motor de origen durante la fase de captura de datos de cambios (CDC). Estos registros se migran al destino y, a continuación, se comparan con los registros correspondientes de la base de datos de destino como parte del proceso de validación. Así es como funciona el flujo de migración genérico en AWS DMS.

AWS DMS también usa memoria para la configuración de tareas y para el flujo de datos del origen al destino.

Resolución

Tareas con configuración de LOB limitada

Cuando migra datos mediante una tarea de AWS DMS con una configuración de LOB limitada, la memoria se asigna por adelantado en función del tamaño de LOB de cada columna LOB. Si se establece en un valor demasiado alto, la tarea podría generar errores. Esto se debe a un error de memoria insuficiente (OOM), en función del número de registros que esté migrando y de CommitRate.

Por lo tanto, si configura la tarea con valores altos, asegúrese de que la instancia de AWS DMS tenga suficiente memoria.

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

Para obtener más información, consulte Setting LOB support for source databases in an AWS DMS task (Configuración de la compatibilidad de LOB para las bases de datos de origen en una tarea de AWS DMS).

Tareas con la validación habilitada

Al migrar mediante una tarea de AWS DMS que tiene ValidationEnabled=true, es posible que vea un uso de memoria adicional. Esto se debe a que AWS DMS recupera los registros ThreadCount * PartitionSize de las bases de datos de origen y destino. A continuación, compara los datos correspondientes de la instancia de replicación. Por lo tanto, durante la migración observará un uso adicional de memoria en la instancia de replicación, la base de datos de origen y la base de datos de destino.

Para limitar la cantidad de memoria en uso, ignore las columnas LOB mediante SkipLobColums. También puede realizar la validación por separado de la tarea de migración mediante una instancia de replicación independiente o una tarea de AWS DMS. Para ello, utilice la configuración ValidationOnly:

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

Para obtener más información, consulte AWS DMS data validation (Validación de datos de AWS DMS).

Tareas con subprocesos paralelos en fases de carga completa y CDC

Cuando utiliza un objetivo que no sea RDBMS, ParallelLoadThreads * ParallelLoadBufferSize determina el número de subprocesos y el tamaño de la transferencia de datos al destino. Del mismo modo, ParallelApplyThreads * ParallelApplyBufferSize determina el número de subprocesos y el tamaño de la transferencia de datos durante la fase CDC. AWS DMS contiene los datos que se extraen de la fuente en ParallelLoadQueusPerThread y ParallelApplyQueuesperThread. Al ajustar esta configuración, asegúrese de que la instancia y el destino de AWS DMS tengan la capacidad de gestionar la carga de trabajo.

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

Para obtener más información sobre estos ajustes, consulte Validación de datos de AWS DMS (Configuración de tareas de metadatos de destino).

Tareas con configuración de aplicación por lotes

Cuando utilice una tarea de AWS DMS con configuración de aplicación por lotes, utilice estas prácticas recomendadas:

  • La configuración por lotes predeterminada siempre es suficiente para gestionar la carga de trabajo normal. En el proceso por lotes, el tamaño del lote y la frecuencia con la que se aplica en el destino vienen determinados por la configuración de BatchApplyTimeoutMin, BatchApplyTimeoutMax y BatchApplyMemoryLimit. Estos ajustes funcionan en conjunto para aplicar los cambios en el lote. Si necesita ajustar esta configuración debido a la gran carga de trabajo en el origen, asegúrese de que la instancia de AWS DMS tenga suficiente memoria. De lo contrario, podría producirse un error de OOM.
  • No configure BatchApplyMemoryLimit en un tamaño superior al de la memoria de la instancia de replicación; de lo contrario, podría producirse un error de OOM. Tenga en cuenta otras tareas que se ejecuten en simultáneo con la tarea de AWS DMS que utiliza para la migración cuando configure BatchApplyMemoryLimit.
  • Las transacciones de larga duración se retienen en la memoria si BatchApplyPreserveTransaction = true está en varios lotes. Esto también puede provocar errores de OOM, según la configuración de memoria de la siguiente sección.
  • Use la configuración BatchSplitSize para establecer el número de cambios que se incluirán en cada lote y para limitar el consumo de memoria:
{
  "TargetMetadata": {
    "BatchApplyEnabled": false,
  },
},
  "ChangeProcessingTuning": {
    "BatchApplyPreserveTransaction": true,
    "BatchApplyTimeoutMin": 1,
    "BatchApplyTimeoutMax": 30,
    "BatchApplyMemoryLimit": 500,
    "BatchSplitSize": 0,
  },

Para obtener más información sobre el uso del modo de aplicación por lotes, consulte Change processing tuning settings (Cambio en la configuración de ajuste de procesamiento).

  • Durante los CDC, MinTransactionSize determina cuántos cambios se producen en cada transacción. MemoryLimitTotal controla el tamaño de las transacciones en la instancia de replicación. Utilice esta configuración cuando ejecute varias tareas de los CDC que necesiten mucha memoria. Asegúrese de asignar esta configuración en función de la carga de trabajo transaccional de cada tarea.
  • Establezca MemoryKeepTime para limitar la memoria que consumen las transacciones de larga duración en el origen. O bien, si se está ejecutando un lote grande de instrucciones INSERT o UPDATE en el origen, aumente este tiempo para retener los cambios del procesamiento en la tabla de cambios netos.
  • Establezca StatementCacheSize para controlar el número de instrucciones preparadas que se almacenan en la instancia de replicación.
  • Si la instancia de replicación de AWS DMS contiene un gran volumen de memoria libre, ajuste la configuración de este ejemplo. Esto significa que AWS DMS gestiona la carga de trabajo en la propia memoria, en lugar de descargarla con frecuencia al almacenamiento de AWS DMS.

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

Para obtener más información sobre estos ajustes, consulte Change processing tuning settings (Cambio en la configuración de ajuste de procesamiento).

Supervisión del uso de memoria de la instancia de replicación

Hay varias formas de supervisar el uso de la memoria de la instancia de replicación. Para aislar la tarea que consume más memoria, ordene las tareas por MemoryUsage. Para saber por qué la tarea retiene memoria, compare cdcChangesMemorySource y cdcChangesMemoryTarget y, a continuación, solucione los problemas del punto de conexión correspondiente.

La propia instancia de replicación utiliza una memoria mínima para ejecutar el motor de replicación. Para verificar si se pueden ejecutar tareas de AWS DMS adicionales en la instancia de replicación, revise la métrica AvailableMemory en Amazon CloudWatch. A continuación, cree una nueva tarea para usar la cantidad de FreeMemory disponible. Cuando ejecute la tarea de AWS DMS, supervise FreeMemory y SwapUsage para ver si la contención de recursos es un problema. Para obtener más información, consulte Replication instance metrics (Métricas de instancias de replicación).

Evitar problemas de memoria

Para evaluar la cantidad de memoria que utiliza la tarea de AWS DMS, pruebe una instancia con la misma configuración en un entorno inferior (desarrollo y ensayo).

Además, realice una migración de prueba de concepto antes de trabajar con los datos de producción.