메모리 사용량 증가
메모리 사용량 증가 원인 찾기
바른 서버의 메모리 사용량이 생각보다 높거나, 기동 직후 메모리를 많이 쓰는 것 같나요?
대부분은 모델·사전 로딩과 교정용 자료구조 때문입니다. 어디에 메모리가 쓰이는지 짚어봐요.
증상
- 서버 기동 직후 메모리 사용량이 크게 올라갑니다.
- 맞춤법 검사 기능이 포함된 빌드가 형태소 분석 전용 빌드보다 메모리를 더 씁니다.
- 운영 중 메모리가 일정 수준에서 유지되거나 캐시로 서서히 증가합니다.
원인
바른이 메모리를 쓰는 곳은 크게 세 부분이에요.
| 구간 | 내용 |
|---|---|
| 모델 | 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 캐싱으로 재시작을 가속하는데, 이 캐시가 메모리 사용에 반영됩니다.
해결
-
빌드 종류를 확인하세요. 형태소 분석만 필요하다면 맞춤법 검사 기능이 없는 빌드가 메모리를 덜 씁니다. 교정 사전 일체를 올리지 않기 때문이에요.
-
무엇을 로딩하는지 기동 로그로 확인하세요. 어떤 모델·사전을 올렸는지 로그로 파악하면, 예상보다 큰 항목을 찾기 쉽습니다.
-
LLM 캐시를 고려하세요(맞춤법 검사 빌드). 어절 교정·띄어쓰기 판별 결과는 캐시에 쌓입니다. 기본 최대 크기가 있어 무한히 늘지는 않지만, 캐시도 메모리를 차지한다는 점을 감안하세요.
-
컨테이너라면 메모리 한계를 넉넉히 잡으세요. 한계를 너무 낮게 잡으면 로딩 도중 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 문서를 참고하세요.
도움이 되었나요?