メモリ負荷 / 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 全体または隣接プロセス (別アプリケーション、ファイルシステムキャッシュの圧迫、メモリリークするヘルパープロセス)。