게임 렉 백서 › L7 서버 OS (커널)
OOM 킬러 Out-of-memory killer
원인 ID so-oom · 주 담당 게임개발팀·서버 개발 · 함께 인프라팀·서버 인프라
그림과 실험이 있는 원본 카드로 열기 →
리눅스는 메모리가 바닥나면 메모리를 가장 많이 쓰는 프로세스를 골라 강제로 죽입니다. 대개 게임 서버입니다.
왜 누수나 폭증으로 메모리 고갈, 또는 컨테이너 메모리 한도 도달 → 그러면 커널이 게임 서버 프로세스를 강제 종료 → 화면에서는 그 서버의 모두가 동시에 접속 끊김, 최근 진행 롤백 가능
- 증상
- 접속 끊김, 씹힘·롤백
- 요인
- 정체
- 누가 겪나
- 서버 전체
- 언제
- 오래 켜 둘수록, 사람이 몰릴 때
- 담당
- 주 담당 게임개발팀·서버 개발 · 함께 인프라팀·서버 인프라
- 게임개발팀 할 일
- 누수 수정, 메모리 사용 상한을 두고 가까워지면 저장 후 정상 종료하는 절차.
- 인프라팀 할 일
- 메모리 경보, 컨테이너 메모리 한도를 실제 사용량에 맞게 설정, 먼저 죽일 순서 조정(oom_score_adj).
- 수치 감각
- 커널 로그(dmesg)에 “Out of memory: Killed process”가 남고 쿠버네티스에서는 OOMKilled로 표시됩니다. 윈도우에는 OOM 킬러가 없고 메모리 할당이 실패하면서 서버가 오류로 죽는 경우가 많습니다.
- 그래프에서는
- 연결이 한꺼번에 끊김 · 접속 수, 메모리 사용량
- 확인할 곳
- dmesg의 “Out of memory: Killed process” 기록, 쿠버네티스면 파드 상태의 OOMKilled, cgroup v2면 memory.events의 oom_kill 증가를 접속이 끊긴 시각과 맞춰 봄
- 이러면 맞음
- 접속이 한꺼번에 끊긴 시각에 게임 서버 프로세스를 죽인 기록이 있고 그 직전까지 메모리 사용량이 한도로 올라감
- 이러면 아님
- OOM 기록이 없는데 프로세스가 죽었으면 “서버 크래시”의 크래시 로그·코어 덤프를 봄
- 확인 수단
- 인프라 도구로 확인(게임 코드 불필요)
출처
- mm/oom_kill.c (Linux v6.12) Linux kernel
메모리를 가장 많이 쓰는 프로세스가 가장 높은 점수를 받도록 계산(oom_score_adj 반영), 종료할 때 “Out of memory: Killed process …” 기록 - Assign Memory Resources to Containers and Pods Kubernetes
컨테이너가 메모리 limit을 넘어 계속 쓰면 종료되고 상태가 OOMKilled로 표시됨 - Pushing the Limits of Windows: Virtual Memory Microsoft
윈도우는 커밋 한도에 닿으면 메모리를 확정하는 할당이 실패하고 앱 오류나 시스템 장애로 이어질 수 있음 - Control Group v2 Linux kernel
memory.events의 oom_kill: 이 cgroup에서 OOM 킬러가 죽인 프로세스 수
함께 보면 좋은 원인
같은 층: L7 서버 OS (커널)
같은 증상(접속 끊김)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기