콘텐츠로 이동

메모리 사용량 증가

메모리 사용량 증가 원인 찾기

바른 서버의 메모리 사용량이 생각보다 높거나, 기동 직후 메모리를 많이 쓰는 것 같나요? 대부분은 모델·사전 로딩과 교정용 자료구조 때문입니다. 어디에 메모리가 쓰이는지 짚어봐요.

증상

  • 서버 기동 직후 메모리 사용량이 크게 올라갑니다.
  • 맞춤법 검사 기능이 포함된 빌드가 형태소 분석 전용 빌드보다 메모리를 더 씁니다.
  • 운영 중 메모리가 일정 수준에서 유지되거나 캐시로 서서히 증가합니다.

원인

바른이 메모리를 쓰는 곳은 크게 세 부분이에요.

구간 내용
모델 seg-model.onnx(분절), tag-model.onnx(품사 태깅) 로딩
교정 사전(맞춤법 검사 빌드) urimal-dict.fb, onterm-dict.fb, word-freq.gob, BK-tree 등
캐시 LLM 어절/띄어쓰기 교정 결과 캐시(맞춤법 검사 빌드)

특히 맞춤법 검사 빌드는 우리말샘·온용어 사전과 단어 빈도(word-freq.gob), 유사어 검색용 BK-tree를 함께 올리므로 형태소 분석 전용 빌드보다 메모리를 더 씁니다.

FlatBuffer + mmap, 그리고 gob 캐싱

urimal-dict.fb·onterm-dict.fb는 FlatBuffer를 mmap으로 로드합니다. BK-tree와 우리말샘 데이터는 gob 캐싱으로 재시작을 가속하는데, 이 캐시가 메모리 사용에 반영됩니다.

해결

  1. 빌드 종류를 확인하세요. 형태소 분석만 필요하다면 맞춤법 검사 기능이 없는 빌드가 메모리를 덜 씁니다. 교정 사전 일체를 올리지 않기 때문이에요.

  2. 무엇을 로딩하는지 기동 로그로 확인하세요. 어떤 모델·사전을 올렸는지 로그로 파악하면, 예상보다 큰 항목을 찾기 쉽습니다.

  3. LLM 캐시를 고려하세요(맞춤법 검사 빌드). 어절 교정·띄어쓰기 판별 결과는 캐시에 쌓입니다. 기본 최대 크기가 있어 무한히 늘지는 않지만, 캐시도 메모리를 차지한다는 점을 감안하세요.

  4. 컨테이너라면 메모리 한계를 넉넉히 잡으세요. 한계를 너무 낮게 잡으면 로딩 도중 OOM으로 종료될 수 있습니다. 자세한 내용은 도커 컨테이너 OOM Kill 문서를 보세요.

word-freq.gob는 무거운 자료예요

단어 빈도 데이터(word-freq.gob)는 유사 단어를 빈도 순위로 추출할 때 쓰이는 큰 자료입니다. 교정 빌드에서 메모리가 크게 잡히는 주된 항목 중 하나이니, 메모리 산정 시 함께 고려하세요.

예방·팁

  • 기동 직후 메모리가 한 번 크게 올라간 뒤 안정되는 것은 모델·사전을 미리 메모리에 올려두는 정상 동작입니다. 요청마다 다시 읽지 않으려는 설계예요.
  • 운영 환경에 맞춰 형태소 분석 전용 빌드와 교정 빌드를 구분해 배포하면 자원을 아낄 수 있습니다.

자주 묻는 질문

Q. 기동 직후 메모리가 확 늘어요. 정상인가요?

정상입니다. 바른은 모델(seg-model.onnx, tag-model.onnx)과 사전을 기동 시 미리 메모리에 올려둡니다. 요청마다 다시 읽지 않기 위한 설계로, 보통 한 번 오른 뒤 안정됩니다.

Q. 맞춤법 검사 빌드가 메모리를 더 많이 쓰는 이유는?

맞춤법 검사 빌드는 우리말샘·온용어 사전, 단어 빈도(word-freq.gob), 유사어 검색용 BK-tree를 추가로 올리기 때문입니다. 형태소 분석만 필요하면 맞춤법 검사 기능이 없는 빌드가 메모리를 덜 씁니다.

Q. 메모리를 줄이려면 어떻게 하나요?

형태소 분석만 필요하다면 맞춤법 검사 기능이 없는 빌드로 운영하세요. 교정 사전 일체를 올리지 않아 메모리를 크게 아낄 수 있어요. 기동 로그로 어떤 모델·사전을 올리는지 확인해 예상보다 큰 항목을 찾고, 운영 환경에 맞게 형태소 분석 전용 빌드와 맞춤법 검사 빌드를 구분해 배포하는 것도 방법입니다.

Q. 운영 중 메모리가 서서히 늘어나는데 정상인가요?

LLM 어절·띄어쓰기 교정 결과 캐시(맞춤법 검사 빌드)가 쌓이면서 늘 수 있습니다. 캐시에는 기본 최대 크기가 있어 무한히 늘지는 않아요. 다만 컨테이너 메모리 한계를 너무 낮게 잡으면 로딩·운영 중 OOM으로 종료될 수 있으니, 자세한 내용은 도커 컨테이너 OOM Kill 문서를 참고하세요.

도움이 되었나요?