🪓삽질노트

[JAVA]java.lang.OutOfMemoryError : Java heap space (4) Scouter를 통한 모니터링

디카페인라떼 2022. 10. 27. 18:26

최종 프로젝트를 진행하면서 인프라를 담당하게 되었는데 그 중 마주친 OOM 에러.(22.10.13 THU) 

끝끝내 원인을 찾지는 못하였지만 어떻게 문제를 분석하고 임시방편이지만 어떻게 처리하였는지 기록해 보고자 한다. 

 

2022.10.26 - [🪓삽질노트] - [JAVA] java.lang.OutOfMemoryError : Java heap space (1) 문제 정의 & 사실 수집 & 원인 추론

2022.10.26 - [🪓삽질노트] - [JAVA] java.lang.OutOfMemoryError : Java heap space (2) 조사 방법 구현 & 결과 관찰

2022.10.26 - [🪓삽질노트] - [JAVA] java.lang.OutOfMemoryError : Java heap space (3) Heap Dump 분석 - MAT


Heap Dump 파일 분석만으로는 감이 안잡혀서

실시간 모니터링으로 어떤 요청이 들어왔을 때 Heap Memory가 잡아 먹히는 지 확인해보고자 하였다.

모니터링을 위해서 스카우터를 사용하였다.

 


Scouter 설치 

🎈미리 서버의 6100번 포트 열어주기!

 

공식 github

github.com/scouter-project/scouter

 

GitHub - scouter-project/scouter: Scouter is an open source APM (Application Performance Management) tool.

Scouter is an open source APM (Application Performance Management) tool. - GitHub - scouter-project/scouter: Scouter is an open source APM (Application Performance Management) tool.

github.com

  • 자바 버전 확인
java -version // java 1.8 이상
  • 깃허브에서 최신 버전 확인 후 설치 
wget https://github.com/scouter-project/scouter/releases/download/v2.12.0.1.SNAPSHOT/scouter-all-2.12.0.1.SNAPSHOT.tar.gz
  • 스카우터 압축 풀기
tar -xvf scouter-all-2.12.0.1.SNAPSHOT.tar.gz
  •  Server (Collector) 실행 -  Server 디렉토리의 startup.sh 실행
ls //전체 파일 확인
cd scouter/server // server디렉토리 이동
sh ./startup.sh // startup 스크립트 실행
cat nohub.out // 스크립트 실행 확인

  • 호스트 에이전트 설치 및 실행 - scouter/agent.host/conf 디렉토리까지 이동
cd scouter/agent.host/conf  //conf까지 이동
sudo vim scouter.conf // 설정 파일로 들어감
  • 설정파일로 들어가서 주석 해제 -> 저장

 

  • scouter/agent.host/conf 디렉토리의 호스트 에이전트 실행
sh host.sh //host gaent 실행
cat nohup.out // 실행여부 확인

  • Client 설치 -> window.zip 다운 -> 압축해제 후 exe 파일 실행

github.com/scouter-project/scouter/releases

 

Releases · scouter-project/scouter

Scouter is an open source APM (Application Performance Management) tool. - scouter-project/scouter

github.com

  • 초기 Id/Pw = admin/admin

 

  • 실행

 

  • connection fail 이 발생한다면 해당 서버의 6100 포트 열어주기!!

 

  • java agent 설정
cd scouter/agent.java/conf // 이동
vi [설정파일이름].conf  //설정파일 만들기
  • 설정파일 내용 채워주기
### scouter java agent configuration sample
obj_name=[설정파일이름]
net_collector_ip=35.168.161.112
net_collector_udp_port=6100
net_collector_tcp_port=6100
#hook_method_patterns=sample.mybiz.*Biz.*,sample.service.*Service.*
#trace_http_client_ip_header_key=X-Forwarded-For
#profile_spring_controller_method_parameter_enabled=false
#hook_exception_class_patterns=my.exception.TypedException
#profile_fullstack_hooked_exception_enabled=true
#hook_exception_handler_method_patterns=my.AbstractAPIController.fallbackHandler,my.ApiExceptionLoggingFilter.handleNotFoundErrorResponse
#hook_exception_hanlder_exclude_class_patterns=exception.BizException

 

  • java 실행시 scouter 같이 실행되도록 명령어 붙여주기
-javaagent:[agent.java 디렉토리 위치]/scouter.agent.jar

-DScouter.config=[설정 파일 위치]/[설정파일명].conf

[기존코드]

nohup java -jar $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &

 

[수정 코드]

nohup java -javaagent:/home/ec2-user/scouter/agent.java/scouter.agent.jar \
    -Dscouter.config=/home/ec2-user/scouter/agent.java/conf/was01.conf \
    -jar $JAR_NAME > $REPOSITORY/nohup1.out 2>&1 &

 


실시간 모니터링

  • 요청보다 먼저 Heap Memory 사용량을 모니터링 해보았다. 애플리케이션에서 이것저것 눌러보는 즉시 가파르게올라가기 시작했다.

 

 

  • 그 시간대의 요청들을 확인해 보니 이렇게 나왔다. 

 

 

 

  • SSE 알림때문인 것 같은데 OOM으로 서버가 뻗었을때 계속 시도되어서 이렇게 된듯 하다

 

  • 다른 많은 요청을 보니 /error가 떠있다.

 

 

  • 확인해보니 ELB에서 보내는 테스트 요청이었다. 설마 이것때문에 힙메모리가 먹히나..?

헬스체크를 200ok로 성공하게 해두어도 마찬가지였다....

 

  • 이 외에는 동일한 전체 조회 , 메인페이지 요청이었다. ......
  • MAT 분석 시에는 firewall 에 막히는 요청이 있었다고 하는데 그러한 요청/에러는 찾아 볼수가 없었다.
  • 왠지 전체적인 코드의 문제 같긴한데 프로젝트 상 내가 전체 코드를 알지 못한다....
  • 왠지 아직은 해결할 수 있는 단계가 아닌 것 같다..
  • 임시방편이라도 대책을 마련해야겠다.

 

 


참고 블로그