AWS DMS は移行のためにメモリをどのように使用しますか?
AWS Database Migration Service (AWS DMS) のタスクで、メモリが想定よりも多く、または少なく使用されています。AWS DMS は移行のためにメモリをどのように使用しますか? また、レプリケーションインスタンスのメモリ使用量を最適化するにはどうすればよいですか?
簡単な説明
AWS DMS レプリケーションインスタンスは、メモリを使用してレプリケーションエンジンを実行します。このエンジンは、フルロードフェーズ中にソースエンジンで SELECT ステートメントを実行します。また、レプリケーションエンジンは、変更データキャプチャ (CDC) フェーズ中にソースエンジンのトランザクションログから読み取りを行います。これらのレコードはターゲットに移行され、検証プロセスの一環としてターゲットデータベース上の対応するレコードと比較されます。これが、AWS DMS での一般的な移行フローの仕組みです。
AWS DMS は、タスクの設定や、ソースからターゲットへのデータフローにもメモリを使用します。
解決方法
LOB 設定が制限されたタスク
LOB 設定が制限された AWS DMS タスクを使用してデータを移行する場合、メモリは各 LOB 列の LobMaxSize に基づいて事前に割り当てられます。この値を高く設定しすぎると、タスクが失敗する可能性があります。この失敗は、移行するレコードの数と CommitRate によっては、メモリ不足 (OOM) エラーが原因で発生します。
そのため、高い値でタスクを設定する場合は、AWS DMS インスタンスに十分なメモリがあることを確認してください。
{ "TargetMetadata": { "SupportLobs": true, "FullLobMode": false, "LobChunkSize": 0, "LimitedSizeLobMode": true, "LobMaxSize": 63, "InlineLobMaxSize": 0, }
詳細については、「Setting LOB support for source databases in an AWS DMS task」(AWS DMS タスクのソースデータベースの LOB サポートの設定) を参照してください。
ValidationEnabled があるタスク
ValidationEnabled=true の AWS DMS タスクを使用して移行すると、メモリ使用量が増える場合があります。これは、AWS DMS がソースデータベースとターゲットデータベースの両方から ThreadCount * PartitionSize レコードを取得するために発生します。その後、レプリケーションインスタンスの対応するデータを比較します。その結果、移行中にレプリケーションインスタンス、ソースデータベース、ターゲットデータベースで追加のメモリ使用量が表示されます。
使用するメモリ量を制限するには、SkipLobColums を使用して LOB 列を無視します。また、別のレプリケーションインスタンスまたは AWS DMS タスクを使用して、移行タスクとは別に検証を実行することもできます。これを実行するには、ValidationOnly 設定を使用します。
"ValidationSettings": { "EnableValidation": true, "ThreadCount": 5, "PartitionSize": 10000, "ValidationOnly": false, "SkipLobColumns": false, },
詳細については、「AWS DMS data validation」(AWS DMS のデータ検証) を参照してください。
フルロードフェーズと CDC フェーズの並列スレッドがあるタスク
非 RDBMS のターゲットを使用する場合、ParallelLoadThreads * ParallelLoadBufferSize によって、スレッドの数とターゲットへのデータ転送のサイズが決まります。同様に、ParallelApplyThreads * ParallelApplyBufferSize によって、CDC フェーズ中のスレッド数とデータ転送のサイズが決まります。AWS DMS は、ソースからプルされたデータを ParallelLoadQueuesPerThread と ParallelApplyQueuesPerThread に保持します。これらの設定を調整するときは、AWS DMS インスタンスとターゲットにワークロードを処理する能力があることを確認してください。
{ "TargetMetadata": { "ParallelLoadThreads": 0, "ParallelLoadBufferSize": 0, "ParallelLoadQueuesPerThread": 0, "ParallelApplyThreads": 0, "ParallelApplyBufferSize": 0, "ParallelApplyQueuesPerThread": 0 },
これらの設定の詳細については、「Target metadata task settings」(ターゲットメタデータタスクの設定) を参照してください。
バッチ適用設定があるタスク
バッチ適用設定がある AWS DMS タスクを使用する場合は、次のベストプラクティスを使用します。
- デフォルトのバッチ設定が、通常のワークロードを処理するのに常に十分であること。バッチ処理では、バッチのサイズとそれがターゲットに適用される頻度は、BatchApplyTimeoutMin、BatchApplyTimeoutMax、および BatchApplyMemoryLimit の設定によって決まります。これらの設定は連携して、変更をバッチで適用します。ソースのワークロードが重いためにこれらの設定を調整する必要がある場合は、AWS DMS インスタンスに十分なメモリがあることを確認してください。十分なメモリがない場合、OOM エラーが発生する可能性があります。
- BatchApplyMemoryLimit をレプリケーションインスタンスメモリのサイズより大きく設定しないでください。これを遵守しないと、OOM エラーが発生する可能性があります。BatchApplyMemoryLimit を設定するときは、移行に使用している AWS DMS タスクと同時に実行されるその他のタスクに注意してください。
- 複数のバッチで BatchApplyPreserveTransaction = true の場合、長時間実行されるトランザクションはメモリに保持されます。次のセクションのメモリ設定によっては、これは OOM エラーを引き起こす可能性もあります。
- BatchSplitSize 設定を使用して、各バッチに含める変更の数を設定し、メモリ消費を制限します。
{ "TargetMetadata": { "BatchApplyEnabled": false, }, }, "ChangeProcessingTuning": { "BatchApplyPreserveTransaction": true, "BatchApplyTimeoutMin": 1, "BatchApplyTimeoutMax": 30, "BatchApplyMemoryLimit": 500, "BatchSplitSize": 0, },
バッチ適用モードの使用の詳細については、「Change processing tuning settings」(変更処理の調整の設定) を参照してください。
その他のメモリ関連のタスク設定
- CDC 中、MinTransactionSize によって、各トランザクションで発生する変更の数が決まります。レプリケーションインスタンス上のトランザクションのサイズは、MemorylimitTotal によって制御されます。この設定は、大量のメモリを必要とする複数の CDC タスクを実行する場合に使用します。この設定は、各タスクのトランザクションワークロードに基づいて割り当ててください。
- MemoryKeepTime を設定すると、ソースで長時間実行されるトランザクションによって消費されるメモリを制限できます。または、大量の INSERT ステートメントまたは UPDATE ステートメントがソースで実行されている場合は、この時間を延ばしてください。この時間を延ばすと、処理による変更がネット変更テーブルに保持されます。
- StatementCacheSize を設定すると、レプリケーションインスタンスに格納されるプリペアドステートメントの数を制御できます。
- AWS DMS レプリケーションインスタンスに大量の空きメモリが含まれている場合は、この例の設定を調整します。これは、AWS DMS がメモリ自体でワークロードを処理し、AWS DMS ストレージに頻繁にフラッシュすることを意味します。
"ChangeProcessingTuning": { "MinTransactionSize": 1000, "CommitTimeout": 1, "MemoryLimitTotal": 1024, "MemoryKeepTime": 60, "StatementCacheSize": 50 },
これらの設定の詳細については、「Change processing tuning settings」(変更処理の調整の設定) を参照してください。
レプリケーションインスタンスのメモリ使用量をモニタリングする
レプリケーションインスタンスのメモリ使用量を監視する方法はいくつかあります。最も多くメモリを消費している単一のタスクを分離するには、タスクを MemoryUsage で並べ替えます。タスクがメモリを保持している理由を確認するには、CDCChangesMemorySource と CDCChangesMemoryTarget を比較し、それぞれのエンドポイントをトラブルシューティングします。
レプリケーションインスタンス自体は、レプリケーションエンジンを実行するために最小限のメモリを使用します。レプリケーションインスタンスで追加の AWS DMS タスクを実行できるかどうかを確認するには、Amazon CloudWatch の AvailableMemory メトリクスを確認します。その後、使用可能な FreeMemory の容量を使用する新しいタスクを作成します。AWS DMS タスクを実行するときは、FreeMemory と SwapUsage をモニタリングして、リソースの競合が懸念されるかどうかを確認します。詳細については、「Replication instance metrics」(レプリケーションインスタンスのメトリクス) を参照してください。
メモリに関する問題を回避する
AWS DMS タスクが使用しているメモリ量を測定するには、前段階の環境 (開発およびステージング) で同じ設定のインスタンスをテストしてください。
また、本番稼働用データを操作する前に、概念実証の移行を実行してください。
関連情報
Choosing the best size for a replication instance (レプリケーションインスタンス用に最適なサイズを選択する)

関連するコンテンツ
- 質問済み 2年前lg...
- AWS公式更新しました 3年前
- AWS公式更新しました 10ヶ月前
- AWS公式更新しました 1年前
- AWS公式更新しました 3年前