메모리 압박 / OOM
서버 메모리가 바닥나고 있거나, 시스템이 스와핑 중이거나, OOM killer가 동작 중이다. 먼저 누가 메모리를 소비하는지 판단한다: 할당 메모리(buffer pool/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;- 할당 메모리(buffer pool / SGA)가 지배적이다
- 세션 메모리(work_mem / PGA)가 폭증한다
- DB가 아닌 프로세스 / OS 전반
- Redis 고유 (maxmemory / eviction / 단편화)
설정된 총 메모리가 물리 RAM을 초과하는가?
고정 할당 메모리가 크다면 두 가지 가능성이 있다: 설정된 총합(buffer pool + 세션 + OS)이 물리 RAM을 초과하거나(over-commit), 크기는 합리적이지만 캐시 적중률이 여전히 낮은 경우다. 설정값을 합산해 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을 초과한다 (over-commit)
- 아니요, 크기는 합리적이지만 캐시 적중률이 낮다
근본 원인: 메모리 over-commit
buffer pool/SGA + 세션 메모리 + OS 요구량의 합이 물리 RAM을 초과한다. 시스템이 스와핑 중이거나 OOM killer가 프로세스를 종료하고 있다.
근본 원인: 캐시 부족 (낮은 캐시 적중률)
할당 메모리가 RAM을 초과하지는 않지만 working set에 비해 작다. buffer cache 적중률이 낮고 DB가 계속 디스크에서 읽는다.
근본 원인: 세션 메모리 폭증
work_mem/PGA 같은 세션별 메모리가 높은 동시성과 곱해져 RAM을 고갈시킨다. 각 sort/hash 작업은 이 메모리를 따로 할당할 수 있다.
근본 원인: Redis 메모리 관리
Redis에서 used_memory가 maxmemory에 도달했거나, eviction이 동작 중이거나, 단편화가 높다(used_memory_rss >> used_memory). 정책과 단편화를 함께 해결해야 한다.
근본 원인: DB 외 메모리 소비
메모리를 소비하는 것은 데이터베이스가 아니라 OS 전체 또는 인접 프로세스다: 다른 애플리케이션, 파일 시스템 캐시 압박, 메모리 누수가 있는 보조 프로세스 등.