You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
예전에 테스트 과정에서 있었던 OOM 이슈가 떠올라서 공유드려 봅니다.
되게 심플하지만 자칫 놓치기 쉬운 부분이었다고 생각합니다 ㅎㅎ
배치성으로 대량의 DB(MongoDB) insert 를 하는 어플리케이션을 개발하였습니다. 에러 처리를 최대한 꼼꼼히 하려 했고, DB 에서 실패할 수 있는 에러들에 대해 모두 custom exception 으로 변환해 주었습니다.
테스트 환경에서 DB 부하 테스트를 하던 도중 부하를 과도하게 많이 주어서 DB 서버의 CPU 가 100% 까지 쳤고, insert 는 모두 실패했습니다.
그러던 중, 애플리케이션이 한동안 아무 로그도 찍지 않고 있다가 OOM 을 일으키며 죽어버리더라구요.
원인은 DB 의 에러메시지를 로깅하는 코드였습니다. 그때까진 최대한 자세한 에러메시지를 로깅하면 좋을거란 생각에 exception.getMessage 를 그대로 custom exception 에 넣어주었거든요.
DB 에 100만 건 가량의 bulk insert 를 했고, DB 의 에러는 insert 된 각 row 의 실패 사유를 한 줄씩 모두 찍어주고 있었습니다. message 변수로 존재할 때는 괜찮았지만 로그를 찍는 순간 몇천만 개의 단어가 로깅되면서 터져버렸던 거였습니다.. ㄷㄷ
그때 이후론 custom exception 의 메시지는 최대한 간결하고 예상 가능하게 넣으려 하고 있습니다. ㅎㅎㅎ
API 서버에선, 사용자에게 보여주는 에러 메시지와 에러 알림/디버깅용 메시지를 따로 분리하는 것도 적용해 보았구요
연관 챕터
#7
조사 내용
책에서 세션을 과다하게 보관하여 힙메모리 이슈가 발생할 수 있다고 안내돼있더라고요.
이와 유사한 사례들을 읽고 같이 공부해보면 좋을 거 같아 준비해봤습니다.
시간이 괜찮으면 두 가지 사례를 같이 읽고, 부족하면 하나만 같이 읽어도 좋을 듯합니다!
어랏!! 여기에서 OOM이 발생할 줄이야...
Java 시스템 운영 중 알아두면 쓸모 있는 지식들
@caffeine-library/readers-release-everything
The text was updated successfully, but these errors were encountered: