콘텐츠로 이동

도커 OOM Kill

도커 컨테이너 OOM Kill 원인 추적

도커로 바른을 띄웠는데 컨테이너가 OOM Kill로 죽나요? 대개는 컨테이너 메모리 한계가 모델·사전 로딩에 필요한 양보다 낮게 잡혀 있어서입니다. 원인을 추적해봐요.

증상

  • 컨테이너가 기동 중 또는 기동 직후 OOM(Out Of Memory)으로 종료됩니다.
  • docker 상태에서 OOMKilled로 표시됩니다.
  • 맞춤법 검사 기능이 포함된 이미지에서 더 자주 발생합니다.

원인

바른은 기동 시 모델과 사전을 메모리에 미리 올립니다. 컨테이너 메모리 한계가 이 로딩 양보다 낮으면, 로딩 도중 커널이 프로세스를 강제 종료(OOM Kill)합니다.

원인 설명
메모리 한계 부족 컨테이너 --memory 한계가 너무 낮음
교정 사전 적재 맞춤법 검사 이미지가 우리말샘·온용어·word-freq.gob·BK-tree까지 올림
동시 부하 다른 컨테이너와 메모리를 다툼

특히 맞춤법 검사 이미지는 형태소 분석 전용보다 사전을 많이 적재하므로 메모리가 더 필요합니다. 자세한 내역은 메모리 사용량 증가 원인 찾기 문서를 보세요.

해결

  1. 메모리 한계를 넉넉히 잡으세요. 컨테이너 메모리 한계가 모델·사전 로딩에 필요한 양보다 커야 합니다. 한계를 올린 뒤 기동되는지 확인하세요.

    docker run --memory 4g --memory-swap 4g bareunai/bareun
    

    수치는 환경에 맞게 조정하세요

    4g는 예시입니다. 사용하는 이미지가 형태소 분석 전용인지 교정 빌드인지에 따라 필요 메모리가 다릅니다. 실제 기동 시 메모리 사용량을 보고 여유 있게 잡으세요.

  2. 이미지 종류를 확인하세요. 형태소 분석만 필요하면 교정 사전을 적재하지 않는 이미지가 메모리를 덜 씁니다. 교정 기능이 꼭 필요한지 점검하세요.

  3. 기동 로그로 어디서 죽는지 보세요. 모델 로딩 중 종료되는지, 사전 로딩 중인지 확인하면 필요 메모리를 가늠하는 데 도움이 됩니다.

  4. 호스트 자원을 확인하세요. 여러 컨테이너가 한 호스트에서 메모리를 다투면 OOM이 납니다. 호스트 전체 가용 메모리와 다른 워크로드도 함께 보세요.

예방·팁

  • 운영 투입 전, 실제 사용할 이미지로 한 번 기동해 안정 시점의 메모리 사용량을 측정하고 그보다 여유 있게 한계를 설정하세요.
  • 기동 직후 메모리가 한 번 크게 오르는 것은 모델·사전을 미리 올리는 정상 동작이므로, 그 피크를 견딜 수 있게 한계를 잡아야 합니다.

자주 묻는 질문

Q. 컨테이너가 OOM Kill로 죽어요. 가장 흔한 원인은?

컨테이너 메모리 한계가 모델·사전 로딩에 필요한 양보다 낮게 설정된 경우입니다. 바른은 기동 시 모델과 사전을 메모리에 미리 올리므로, 그 피크를 견딜 만큼 한계를 키워야 합니다.

Q. 교정 이미지에서 OOM이 더 자주 나는 이유는?

맞춤법 검사 이미지는 우리말샘·온용어 사전, 단어 빈도(word-freq.gob), 유사어 검색용 BK-tree까지 적재하기 때문에 형태소 분석 전용 이미지보다 메모리가 더 필요합니다.

Q. --memory는 얼마로 잡아야 하나요?

정해진 값은 없어요. 형태소 분석 전용인지 교정 빌드인지에 따라 필요 메모리가 다르기 때문입니다. 실제 사용할 이미지로 한 번 기동해 안정 시점의 메모리 사용량을 측정하고, 기동 직후의 로딩 피크까지 견딜 만큼 여유 있게 잡으세요. 예시의 4g는 그대로 쓰는 값이 아니라 시작점일 뿐입니다.

Q. 어느 단계에서 죽는지 어떻게 알 수 있나요?

기동 로그를 보면 모델 로딩 중인지 사전 로딩 중인지 확인할 수 있어요. 어디서 종료되는지 알면 필요 메모리를 가늠하는 데 도움이 됩니다. 여러 컨테이너가 한 호스트에서 메모리를 다투는 경우도 있으니 호스트 전체 가용 메모리도 함께 점검하세요.

도움이 되었나요?