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

メモリ負荷 / OOM

症状

OOM killer がプロセスを強制終了する、'out of memory'、低いキャッシュヒット率、過剰なスワップ、Redis の 'OOM command not allowed'。

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

DB に割り当てられたメモリ (バッファプール/SGA)、セッションごとのメモリ (PGA/sort/work_mem)、OS 全体のどれか。OS レベルで free/vmstat を、DB 内でメモリビューを確認する。

Oracle

SELECT component, current_size/1048576 mb FROM v$memory_dynamic_components WHERE current_size>0;

PostgreSQL

SHOW shared_buffers; SHOW work_mem; -- work_mem * connections * number of sorts can blow up in total

MySQL

SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; SHOW STATUS LIKE 'Innodb_buffer_pool%';

Redis

INFO memory  # used_memory, maxmemory, mem_fragmentation_ratio

2. 設定と負荷を切り分ける

メモリ設定の合計が物理 RAM を超えていないか (オーバーコミット)。shared_buffers + (work_mem * 同時実行数) を計算する。あるいは一時的な負荷 (巨大なソート/ハッシュ、多数の接続) か。

3. Redis 固有: エビクションと断片化

used_memory が maxmemory に達している場合は maxmemory-policy を確認する (noeviction では書き込みが拒否される)。mem_fragmentation_ratio が高ければ MEMORY PURGE / activedefrag を使う。大きなキーは --bigkeys で見つける。

Redis

CONFIG GET maxmemory-policy
MEMORY DOCTOR
redis-cli --bigkeys

4. 即座に緩和する

メモリを食っている暴走クエリ/セッションを強制終了し、work_mem などのセッションメモリを一時的に下げ、不要な接続を切断する。システムがスワップしているなら、スワップからの脱出が最優先。

5. 適切にサイジングする

ツール > Memory/Buffer Pool 計算ツールで RAM を適切に配分する。一般則: 専用サーバーではバッファプール/SGA は RAM の ~70-80%。セッションメモリの合計に同時実行数を掛け、RAM を超えないようにする。必要なら RAM を追加する。

DBAtlas で開く →