본문 바로가기
데브옵스

VisualVM Remote로 연결하여 모니터링하기 (feat. EC2, Docker)

by __Minnie_ 2024. 5. 18.

위 사진은 제 EC2 내부 아키텍처입니다. 도커가 돌고 있고, 도커 컨테이너에 nginx, api server, redis가 돌고 있습니다.

 

제가 하고자 하는 것은 spring boot api server에 visualvm을 연결하여 모니터링 하는 것입니다. 

 

ec2에서는 GUI를 지원하지 않기 때문에 visualvm을 통해 디버깅을 하기 위해서는 로컬에서 remote로 접속해야 했습니다.

 

remote로 접속하기 위해서는 spring server에 먼저 jmx를 활성해주어야 합니다.

더보기

* JMX란?
jmx란 java managemet extensions의 약자로 jvm내의 어플리케이션을 관리하고 모니터링 하기 위한 API와 시스템을 제공합니다.  

 

먼저, jar파일 실행시 아래의 jvm 파라미터를 설정합니다.

  • -Dcom.sun.management.jmxremote=true
  • -Dcom.sun.management.jmxremote.local.only=false
  • -Dcom.sun.management.jmxremote.port=<jmx port>
  • -Dcom.sun.management.jmxremote.ssl=false
  • -Djava.rmi.server.hostname=<서버 ip>
  • -Dcom.sun.management.jmxremote.rmi.port=<jmx port>
  • -Dcom.sun.management.jmxremote.authenticate=false

또한 docker container에 jmx port 설정을 해주어야 합니다.

저의 경우, docker compose를 통해 환경을 구축하였기 때문에 아래처럼 docker compose 파일을 구성해주었습니다.

server: 
	container_name: server
    build:
    	context: ./server
    ports:
    	- "8080:8080"
        - "1099:1099"
   	depends_on:
    	- db
    command: ["java", "-Dcom.sun.management.jmxremote=true", 
    "-Dcom.sun.management.jmxremote.local.only=false", 
    "-Dcom.sun.management.jmxremote.port=<jmx port>", 
    "-Dcom.sun.management.jmxremote.ssl=false", 
    "-Djava.rmi.server.hostname=<ec2 ip>", 
    "-Dcom.sun.management.jmxremote.rmi.port=<jmx port>", 
    "-Dcom.sun.management.jmxremote.authenticate=false", 
    "-jar", "server.jar"]

 

 

이제 로컬에서 visualvm으로 remote접속을 해봅시다.

 

먼저 visualvm을 다운로드 받습니다. (linux)

apt install visualvm

 

 

그리고 visualvm을 실행합니다. 그러면 아래 사진과 같은 화면이 실행됩니다.

위 화면에서 좌측 중단에 있는 Remote를 우클릭하고 `add remote host`를 클릭합니다.

 

host name에 ec2의 public ip를 입력해줍니다.

 

그러면 위 사진처럼 remote 탭에 서버의 ip가 생성됩니다. 해당 ip를 우클릭하여 add jmx connection을 클릭하고, 위 jvm 파라미터 설정시 입력했던 jmx port를 입력해줍니다. 그리고 아래 OK버튼을 누르면 정상적으로 연결됩니다.

 

정상적으로 연결되면 위 사진과 같은 화면이 뜨고, monitor, threads, sampler, buffer pools, visual GC등 다양한 기능들을 사용할 수 있고, plugin을 설치하여 새로운 기능을 더 추가하여 사용할 수도 있습니다.