개인 자료란 (JE)

  서버 커뮤니티


Profile 김푸유 대표칭호 없음

poui_ a533b79dbebd472f92761a8bd39d66e8

Profile

강좌 및 개발 개발자란 개발 잡담 일반

메모리 누수 해결기 (Minecraft Memory leak)

2022.02.09 조회 수 1542 추천 수 4

서버 환경 : i7-8700, 32GB, 램 할당 20GB, paperspigot 1.12.2, Java 8

서버 동시 접속자 수가 130명 즈음을 넘어가면서, 오후 8시 이후 메모리 사용량이 한계에 도달하기 시작했습니다.

8cef3d7fd7cf995a47bab612ae900164.pngVisualVM 프로그램 이용 


이후 급격하게 GC 가 일어나면서 전체 유저가 튕기게 되었고, 이후 ClearLag에 의해 10~20분 주기로 몇 초간 렉이 발생하면서 임의로 lagg gc 명령어를 실행하여 메모리를 유지하게 되었고, 이 과정이 일어날 때마다 유저분들은 불편을 겪어야 했습니다. 

da3ee9985e1449ae86062a6c490d919a.pngClearLag config.yml, 10분마다 19500을 넘어가면 lagg gc가 실행되게 설정 

6c3f7cc0b9d20ac9cef94dfd4156b4f0.png처음이자 마지막으로 튕김 현상이 있었을 때 로그 

47f7893830c2ba00631e95c393882665.png

1ee9a97a2f1b57c87fefe33c71d42b42.png/spark tps 

며칠 전 TPS 저하 현상이 있어 개선을 했기 때문에 TPS 는 정상이었고, 메모리 쪽에서 무언가 문제가 있다고 생각이 들었습니다.

이에 따라 저는 메모리 사용 현황을 분석해 보기로 했습니다.

일단 /spark heapsummary를 살펴보았습니다. (spark 플러그인 필요)

31ae093aae0f38023783527bd3478c56.png




가장 눈에 띄는 건 HashMap 관련이고, 위에 로그에서 본 Criterion도 보입니다. Advancement 도 보입니다.


다음은 이클립스의 mat (Memory Analyzer)을 이용한 분석입니다.

자세한 사용방법은 https://shonm.tistory.com/646 를 참고하였습니다.


먼저 /spark heapdump를 이용해 heap dump를 만들어 주었습니다. (이 과정에서 서버 멈춤이 발생할 수 있으며 plugins/spark 폴더에 저장됩니다.)


Overview 화면입니다. 먼저 Leak Suspects를 눌러 들어가 줍시다.

1759d1fa5fab2ca38e41ab2950b20125.png


1번째 문제부터 살펴보자면 로그, heap summary에서 발견한 주요 문제들이 여기서 보이게 됩니다.

2397cb7269e0dcf1ec480f09933d7ae3.png



2번째 문제도 동일합니다. 

298d4d3585abcbb57a061e2990cc2e0c.png



이제 다시 OverView로 돌아가 왼쪽 하단에 Dominator Tree를 클릭해 보겠습니다. 

82a49eb45654778abfa3b58b7d1f69a8.png

위에서 본 AppClassLoader가 18.86%, 스크립트 관련이 약 5%를 차지하고 있는 걸 볼 수 있습니다. 


7490bcf2489159d4803afa00a95590a7.png


여기서부터는 해외 포럼의 도움을 받았습니다.


https://papermc.io/forums/t/help-needed-with-memory-leak/437

이분도 heap dump를 생성해 분석해 본 결과 저와 같은 결과를 얻게 되었다고 합니다.

9d89c3c852dcc82a9c46673cee90d2bf.png


네...  advancements를 비활성화 하여야 한답니다.  


d5a6834f702d26faeb1f063f637e2059.png

95af9f9042115eaa283bd0a282e76f32.png

비슷한 게시물입니다.

https://github.com/PaperMC/Paper/issues/3050


이렇게 설정한 후 재부팅을 하고 다시 /spark heapsummary 명령어를 이용하여 상태를 살펴보았습니다. (오전 6시 재부팅 후 오후 12시 동접 70명쯤 되었을 때) 

2f47b270f594ea6e44b27cd53d8d6bce.png

결과는 아주 만족스러웠습니다.


4b60bb55af5071686df5e445cfba7f9c.png

17시간동안 912MB나 쌓인 Criterion 관련은,

 

cd3d07dbe48ef50e998005e5862ac906.png

6시간동안 겨우 1개만 있는것을 볼 수 있습니다.


HashMap 또한

17시간동안 88,745,405개 -> 6시간동안 2,094,402 개, 10시간동안 2,159,532 개로 엄청나게 개선된 걸 볼 수 있었습니다.


03c8ffcb34caa3fb1f38f15368d8a81c.png개선 전, Uptime 8 hrs 18 min, 6GB ~ 14GB 


7c05b94df1aa58825f82b930fdc56302.png개선 후, Uptime 9 hrs 48 min, 3GB ~ 12GB 
VisualVM에서도 이전보다 메모리 사용량이 줄어든 것을 확인할 수 있었습니다.



2개의 댓글

막국수
2022.02.09

귀중한 정보 감사합니다!

명이
2022.02.11

좋은 정보네요.

뉴스 및 컨텐츠
/files/thumbnails/976/232/003/262x150.crop.jpg?20220525065427

유튜브

마켓플레이스 5주년 기념 트레일러 영상 공개 (댓글반응은 덤..) 1

프리루트

2022-05-25

1

/files/thumbnails/897/232/003/262x150.crop.jpg?20220524225728

업데이트

마인크래프트 1.19 프리릴리즈 2 출시

BMlight

2022-05-24

1

/files/thumbnails/600/232/003/262x150.crop.jpg?20220524020530

페이스북

마인크래프트 1.19 야생 업데이트 맛보기 영상 공개 (깊은 어둠, 알레이 편) 1

프리루트

2022-05-24

0

/files/thumbnails/871/230/003/262x150.crop.jpg?20220521161559

업데이트

마인크래프트 1.19 프리릴리스 1 업데이트 1

마리오군

2022-05-21

0