メモリ負荷 / 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 totalMySQL
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; SHOW STATUS LIKE 'Innodb_buffer_pool%';Redis
INFO memory # used_memory, maxmemory, mem_fragmentation_ratio2. 設定と負荷を切り分ける
メモリ設定の合計が物理 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 --bigkeys4. 即座に緩和する
メモリを食っている暴走クエリ/セッションを強制終了し、work_mem などのセッションメモリを一時的に下げ、不要な接続を切断する。システムがスワップしているなら、スワップからの脱出が最優先。
5. 適切にサイジングする
ツール > Memory/Buffer Pool 計算ツールで RAM を適切に配分する。一般則: 専用サーバーではバッファプール/SGA は RAM の ~70-80%。セッションメモリの合計に同時実行数を掛け、RAM を超えないようにする。必要なら RAM を追加する。