JAVA

서버 모니터링 툴(visualVM) 을 붙여보자!

코린이s 2022. 2. 19. 15:47
728x90

서버의 메모리와 CPU를 모니터링 할일이 생겨 모니터링 툴이 필요했다.

여러 모니터링툴중 오픈 소스인 visualVM 을 사용해보자!

java 프로세스 띄울시 jvm 옵션에 설정을 주어 해당 자바 어플리케이션의 자원 사용량을 볼 수 있으며 어떤 클래스에서 얼마나 사용하는지도 볼수 있어서 자바 소스 코드의 메모리 누수를 찾는데도 용이하다. (저자는 이전에 푸시 서비스를 구현하였으나 메모리 누수가 있어 해당 서비스로 누수 원인을 찾았다. 궁금하다면 아래 TMI 부분을 보면 된다.)

자 그럼 설치부터 진행해보자! (저자는 ec2 인스턴스에 자바 프로세스를 띄우고 모니터링을 로컬에서 띄우는 실습을 진행한다.)

- 설치 : https://visualvm.github.io/download.html

 

VisualVM: Download

First Steps Unzip the downloaded archive. The archive already contains the top-level visualvm directory. Start VisualVM by invoking the binary appropriate for your OS:visualvm\bin\visualvm.exe or visualvm/bin/visualvm You may provide additional options to

visualvm.github.io

실행 시키려는 자바 프로세스의 JVM 옵션에 아래 설정을 추가한다.

$ vi logstash-7.6.0/config/jvm.options
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.port=[jvm access port]
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=[ec2 public ip]
-Dcom.sun.management.jmxremote.rmi.port=[jvm access port]

jvm access port 는 두개 모두 동일하게 넣고 (다르게 넣어 봤을때 연결 되지 않고 이부분은 다음에 더 찾아본다) 두 설정 중 하나라도 빠지면 접속 안되니 모두 설정한다.

추가로 hostname 부분은 접속할때와 같은 ip 를 넣어야 하여 public ip 를 넣는다. (만약 로컬에서 띄우고 로컬에서 jvm 접속하는 것이라면 back ip 를 넣어도 되나 지금은 ec2 를 내 로컬 pc 에서 접속하는 것이니 로컬 pc 에서 접속할 수 있는 public ip 를 넣는다.)

설정 하여 프로세스를 기동 하였으면 visualVm을 실행 시키고 remote 에서 오른쪽 마우스를 클릭후 add remote host 를 클릭한다.

그리고 host name 란에 접속할 호스트 IP를 적고 display name에는 원하는 이름을 적는다.

저자의 경우 /etc/hosts 파일에 해당 명칭(logstash)을 ec2 public ip 로 설정하였기에 host name 에 아래와 같이 적었으나

host 설정 한 것이 아니라면 ec2 pulic ip 를 넣는다.

그다음 생성된 부분에 오른쪽을 클릭하여 add JMX Connection 을 누른다. 

그 다음 ec2 public IP 와 jvm port 를 적는다.

저자는 위와 동일하게 host 설정을 하였기에 logstash 라고 적으며 설정한 포트인 9900을 적는다.

그리고 만약 위에 설정에서 authenticate 설정을 true 로 하였다면 설정한 id/pw를 입력하고 

jmxremote.ssl 를 true로 설정하였다면 ssl 관련 체크박스 해제 한다.

저자는 모두 false 이기에 아래 이미지와 같이 입력하고 ok 를 누른다.

이제 모니터링 준비는 완료 되었다!

# TMI

메모리 누수의 원인은 fcm 연동 코드를 오픈 소스를 사용하여 구현 하였는데 사용하는 메소드에서 메모리 누수가 발생하였다.

푸시 발송이 완료된 후에도 visual vm 에서 제거되지 않은 메모리에 대한 상세 정보를 보았고 어떤 클래스에서 해당 메모리를 만들었는지 나와 소스에서 해당 클래스를 확인하니 파일을 사용하고 닫는 부분이 빠져 있었고, 메모리 누수로 인해 out of memory 오류가 발생하였던것이다.

해결 방안으로 오픈소스에 메모리 누수를 발생시키지 않는 메소드가 있어 메소드를 교체하여 해결한 일이 있다.

# 추가 정보

- local pc > 모니터링 대상 서버로 접근하려는 포트가 열려있어야 한다.

- EC2 라면 security group or ACL 에서 포트를 열어 둔다.

- 일반 서버라면 방화벽 설정을 보고 포트를 열어 둔다.

728x90