DBAtlas · データベース運用アトラス

メモリ負荷 / OOM

サーバーのメモリが不足している、システムがスワップしている、または OOM killer が作動している。まず誰がメモリを消費しているかを特定する: 割り当て済みメモリ (バッファプール / SGA)、セッションメモリ (work_mem/PGA)、OS 全体、それとも Redis 固有の状況か?

誰がメモリを消費しているか?

メモリ負荷の発生源を層ごとに切り分ける。割り当て済み (固定) メモリが大きすぎるのか、セッションごとのメモリが爆発しているのか、DB 以外のプロセスが消費しているのか、それとも Redis 自身のメモリ管理が関係しているのか?

SELECT component, ROUND(current_size/1024/1024) AS mb FROM v$memory_dynamic_components WHERE current_size>0 ORDER BY current_size DESC;
  • 割り当て済みメモリ (バッファプール / SGA) が支配的
  • セッションメモリ (work_mem / PGA) が爆発している
  • DB 以外のプロセス / OS 全体
  • Redis 固有 (maxmemory / eviction / 断片化)

構成したメモリの合計が物理 RAM を超えているか?

固定で割り当てたメモリが大きい場合、2 つの可能性がある: 構成した合計 (バッファプール + セッション + OS) が物理 RAM を超えている (オーバーコミット) か、サイズは妥当だがキャッシュヒット率が依然として低いかである。設定を合計して RAM と比較する。

SHOW PARAMETER sga_target;  SHOW PARAMETER pga_aggregate_target;
SELECT ROUND(value/1024/1024/1024,1) AS host_ram_gb FROM v$osstat WHERE stat_name='PHYSICAL_MEMORY_BYTES';
  • はい、構成した合計が RAM を超えている (オーバーコミット)
  • いいえ、サイズは妥当だがキャッシュヒット率が低い

根本原因: メモリのオーバーコミット

バッファプール / SGA + セッションメモリ + OS の必要量の合計が物理 RAM を超えている。システムがスワップしているか、OOM killer がプロセスを強制終了している。

根本原因: キャッシュ不足 (キャッシュヒット率が低い)

割り当てメモリは RAM を超えていないが、ワーキングセットに対して小さい。バッファキャッシュのヒット率が低く、DB は常にディスクから読み取っている。

根本原因: セッションメモリの爆発

work_mem/PGA などのセッションごとのメモリが高い同時実行数と掛け合わされ、RAM を使い果たしている。ソート / ハッシュ操作ごとに、このメモリが個別に割り当てられることがある。

根本原因: Redis のメモリ管理

Redis で used_memory が maxmemory に達している、エビクションが発生している、または断片化率が高い (used_memory_rss >> used_memory)。ポリシーと断片化への対処が必要。

根本原因: DB 以外のメモリ消費

メモリを消費しているのはデータベースではなく、OS 全体または隣接プロセス (別アプリケーション、ファイルシステムキャッシュの圧迫、メモリリークするヘルパープロセス)。

DBAtlas で開く →