MongoRepository를 통한 대량 데이터 삽입시 발생한 이슈 #4

LSM ·2022년 3월 25일
0

지난 이슈에 대한 회상....

지난 이슈는 200만개의 데이터를 saveAll 메서드를 통해 수행하던 중 OOM을 만났고 해결한 문제를 말씀드렸습니다. Chunk_size로 데이터 리스트를 분할하여 문제를 해결할 수 있었던 경우였습니다!

자세한 내용은 이슈정리 #3 의 글을 통해 확인하시면 될 듯 합니다 😊


해당 시리즈의 마지막입니다 ^^..

다시 한번더 언급하겠습니다.

'MongoRepository를 통한 대량 데이터 삽입시 발생한 이슈' 시리즈에서는,

고객의 요청으로 삽입시 수용가능한 데이터의 크기가 점점 늘어나면서 최종적으로는 300만개까지 삽입을 처리하였고 처리과정에서 어떤 문제가 발생했는지 그리고 왜 300만개 까지만 확인 가능하였는지를 말씀드리겠습니다!

🧐 이번 글은 마지막 단계인 왜 300만개 까지만 확인 가능하였는지를 말씀드리겠습니다


확인해주세여!

글을 보시기전 ! 삽입되는 데이터 하나의 크기는 330Byte 였으며,
필자는 맥북프로19 - (6코어, 메모리 16GB)의 데스크 탑으로 실행했음을 말씀드립니다 👌


300만개 이상 삽입시 발생하는 OOM 문제

이번에도 여전히 OOM 문제 였는데요..

이제는 조금은 OOM에 익숙해진게 아닌가 생각이 듭니다 ㅎㅎ

바로 본론으로 들어가겠습니다.

이번에는 삽입되는 데이터의 갯수를 300만개 이상 늘리면서 문제가 발생했습니다!

이전 게시물과 같이 먼저 발생한 오류의 로그를 확인해보겠습니다.🧐

네 첫줄에서 확인이 가능하죠? ㅎㅎ

메인 스레드에서의 Out of Memory 문제가 발생한 것 입니다. 이거 데자뷰인가요??

사실 이번 오류는 지난 오류와 달리 금방 눈치 챌 수 있었습니다 ^^

삽입 API는 Controller 영역에서 클라이언트의 request를 처리합니다 !

아래 코드에서 보듯이 '@RequestBody List bodyList' 부분은 클라이언트에서 받은 Bson 형태의 String을 jackson 라이브러리를 통해 Document 객체로 역직렬화가 됩니다 ㅎㅎ

@PostMapping("api/MetaDataList/insert/{projectId}")
    public ResponseEntity<? extends  BasicResponse> insertAllByMetaDataList(@PathVariable String projectId,@RequestBody List<Document> bodyList)

네! 맞습니다 👌👌👌

readString을 통해 진행된 역직렬화 과정에서 Out of Memory가 발생한 것 입니다.

즉 Jvm에서 heap 영역에 할당되는 동적메모리의 허용치가 넘었다고 볼 수 있겠네요!

그래서 Jvm에서 heap 영역에 어느정도의 메모리를 할당하는 지 확인해 보았습니다.

확인해 보니,

Jvm의 Heap은 사용자 메모리의 1/64을 Heap init size 로 1/4을 Heap max size 로 둔다고 합니다.

저는 16GB RAM을 가진 스펙의 데스트톱이기에 계산해 보면 위 수치가 얼추 맞다는 것을 확인할 수 있습니다.

Heap max size = 4GB &&

Heap init size = 268MB 입니다.

그리고 확인해 볼게 하나 더 있죠?

👉 바로 MongoDB에 삽입되는 Document의 사이즈 입니다!! => 평균적으로 338Byte인것을 확인했습니다.

그렇다면 이제는 계산을 통해 입증을 해보면 됩니다 ㅎㅎ

338Byte Document 기준 , 1MB 당 13889개 Document 객체 생성 가능합니다.

Heap init size 기준 최대 3541666개라는 결론이 나오는데요,

다른 객체들의 heap 메모리 점유 크기를 뺀다면 대충 300만개가 최대 가능치인 것을 확인 할 수 있습니다.

결론은,

내 데스크탑 사양문제다 ^^

제가 짠 코드나 로직의 문제가 아님을 확인하고 너무 좋았습니다.

물론 300만개 이후의 경우를 아직 테스트 해보지 못해 두렵긴 하지만 문제가 없을거라 아니 없었으면 좋겠습니다 ㅎㅎ

실제로 배포하는 서버는 RAM 사양이 512GB인데요 이정도 사양이면 큰 문제 없을 거라 추측됩니다 😏😏😏


🥇 정리!

'MongoRepository를 통한 대량 데이터 삽입시 발생한 이슈' 시리즈가 잠정적으로 끝이 났습니다!!

다양한 문제를 마주했고 그 속에서 많은 것을 배웠습니다. 역시 개발은 디버깅이 절반인듯합니다 ㅎ

긴 시리즈 읽어 주셔서 감사합니다~


다음 시리즈 예고..

아니..? 100만개 Update 하는데 도데체 얼마나 걸리는거야... ㅠㅠ

'MongoRepository를 통한 대량 데이터 업데이트 시 발생한 이슈' 시리즈로 찾아 뵙겠습니다.

읽어 주셔서 감사합니다! 잘못된 점이 있다면 댓글로 남겨주세요 더 공부하겠습니다😭😭😭

profile
개발 및 취준 일지

1개의 댓글

comment-user-thumbnail
2022년 3월 26일

현재 오류가 있어 수정 중입니다

답글 달기