Cute Light Pink Flying Butterfly VisualVM | 리눅스서버에 올린 프로세스에 붙어 모니터링하기 :: 놀면서 돈벌기
본문 바로가기
Coding/Back-end

VisualVM | 리눅스서버에 올린 프로세스에 붙어 모니터링하기

by 왓츠뉴 whatsnew 2025. 3. 20.
반응형

VisualVM 이란

VisualVM은 Java 애플리케이션의 성능 모니터링을 위한 도구입니다.
실행 중인 Java 프로세스의 CPU, 메모리 사용량, GC 동작, 스레드 상태 등을 실시간으로 확인할 수 있고,
원격 JMX 연결을 통해 리눅스 서버에서 실행 중인 Java 애플리케이션에도 연결하여 실시간 모니터링 할 수 있습니다.

• CPU 사용량, 메모리 사용량 확인
  GC(Garbage Collection) 상태 확인
  Thread 상태 추적
  Heap Dump 분석
  Deadlock 탐지 

 

2.1.10.ver

 

 

📎Application Tabs 설명

각 탭에 우클릭을 통해 모니터링 파일을 추가하고, 연결할 수 있습니다.

 

📌 Local - 내 PC에서 실행 중인 Java 애플리케이션 목록입니다.

📌 Remote - 원격 서버에서 실행 중인 Java 애플리케이션 목록입니다.

📌 Logfiles - Java 애플리케이션 실행 중 생성된 로그 파일을 확인할 수 있습니다.

📌 VM Coredumps - Java Virtual Machine(JVM) 충돌 시 생성된 덤프 파일로, 문제 원인을 분석하는 데 사용됩니다.

📌 JFR Snapshots - Java Flight Recorder(JFR)에서 수집한 실행 기록 데이터로, 애플리케이션의 성능을 분석할 때 활용됩니다.

📌  Snapshots - 실행 중인 애플리케이션의 Heap Dump 또는 CPU 프로파일링 데이터를 저장한 파일로 성능 이슈를 분석할 때 중요한 데이터 입니다.

📌 Coherence Clusters - Oracle Coherence 기반의 분산 캐시 클러스터를 모니터링하는 기능입니다.

 

📎설정방법

✳️ 프로세스 설정파일 수정

리눅스 서버에 올려놓은 프로세스 실행파일의 설정파일 내용을 수정합니다.(.sh)

To-be의 JMX Config 부분을 (Spring Config위쪽에)추가하고, else 아래에 실행옵션으로 추가하였습니다.

임의로 설정하는 포트같은 경우에는, '10.101.101.95:2022' 서버에 여러개의 프로세스가 존재한다면

포트번호를 모두 다르게 설정해주어야 합니다. ex) 서비스1 = 29887, 서비스2 = 29888

 

AS-IS : 


  
#!/bin/sh
JAVA_PATH=/usr/local/JAVA/jdk1.8.0_111/bin/java
#JAVA_PATH=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64/bin/java
HERE_PATH=/svc/app/ami/ami-data
SERVICE_NAME=amidata
APP_NAME=ami-data
PID_FILE=${HERE_PATH}/pid/${SERVICE_NAME}.pid
JAR_NAME=${SERVICE_NAME}.jar
## GC config
GC_LOG_PATH=/logs/gcLog/${SERVICE_NAME}/gc.log
JAVA_OPTION="${JAVA_OPTION} -Xms1024M -Xmx4096M -XX:MaxMetaspaceSize=256m"
JAVA_OPTION="${JAVA_OPTION} -XX:+UseConcMarkSweepGC"
JAVA_OPTION="${JAVA_OPTION} -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintGCDetails"
JAVA_OPTION="${JAVA_OPTION} -Xloggc:${GC_LOG_PATH}"
JAVA_OPTION="${JAVA_OPTION} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=9 -XX:GCLogFileSize=20m"
## Spring config
SPRING_OPTION="${SPRING_OPTION} -Dspring.config.location=../config/ -Dspring.profiles.active=dev"
#SPRING_OPTION="${SPRING_OPTION} -Dspring.config.location=../config/ -Dspring.profiles.active=${Profile}"
mkdir -p /logs/gcLog/amiservice
case $1 in
start)
echo ""
PCOUNT=`ps -ef |grep '${APP_NAME}' |grep -v grep |wc -l`
echo "pcount=${PCOUNT}"
if [ $PCOUNT -ne 0 ]
then
echo "already run ${APP_NAME} . pid:`cat $PID_FILE`"
else
# ${JAVA_PATH} -classpath .:../config ${SPRING_OPTION} ${JAVA_OPTION} -DAppName=${APP_NAME} -jar ${JAR_NAME} 1>&2 &
${JAVA_PATH} -classpath .:../config ${SPRING_OPTION} ${JAVA_OPTION} -DAppName=${APP_NAME} -jar ${JAR_NAME} > /dev/null 2> /dev/null < /dev/null &
echo "$!" > ${PID_FILE}
echo "START ${SERVICE_NAME}. pid:$!"
ps -ef |grep `cat ${PID_FILE}` |grep -v grep
fi
echo ""
;;
stop)
echo ""
kill -9 `cat ${PID_FILE}`
echo "STOP ${SERVICE_NAME}. pid:`cat ${PID_FILE}`"
echo ""
;;
status)
echo ""
echo "STATUS ${APP_NAME}."
ps -ef |grep ${APP_NAME} |grep -v grep |grep `cat ${PID_FILE}`
echo ""
;;
*)
echo "./run.sh start|stop|status"
esac

 

TO-BE : 


  
## 추가
## JMX config
JMX_OPTION="-Dcom.sun.management.jmxremote"
JMX_OPTION="${JMX_OPTION} -Dcom.sun.management.jmxremote.authenticate=false"
JMX_OPTION="${JMX_OPTION} -Dcom.sun.management.jmxremote.ssl=false"
JMX_OPTION="${JMX_OPTION} -Djava.rmi.server.hostname=10.101.101.95" #리눅스 서버주소
JMX_OPTION="${JMX_OPTION} -Dcom.sun.management.jmxremote.port=25445" #임의 포트번호 설정
JMX_OPTION="${JMX_OPTION} -Dcom.sun.management.jmxremote.rmi.port=25445" #임의 포트번호 설정
## 수정 - ${JMX_OPTION} 추가
else
# ${JAVA_PATH} -classpath .:../config ${SPRING_OPTION} ${JAVA_OPTION} -DAppName=${APP_NAME} -jar ${JMX_OPTION} ${JAR_NAME} 1>&2 &
${JAVA_PATH} -classpath .:../config ${SPRING_OPTION} ${JAVA_OPTION} -DAppName=${APP_NAME} -jar ${JMX_OPTION} ${JAR_NAME} > /dev/null 2> /dev/null < /dev/null &

 

✳️ 프로세스 설정파일 수정

프로세스 재기동을 합니다. 저의 프로세스에서는 ./run.sh start|stop|status로 실행 명령어를 작성하는데.

./run.sh stop -> ./run.sh start로 재기동 해주었습니다.

 

✳️ jmx 포트 확인

위에 설정파일에 임의로 설정한 포트번호를 조회합니다.

조회되지 않으면 제대로 설정되지 않은거에요.


  
netstat -anl | grep 25445

 

✳️ VisualVM에 remote서버 추가

Application-Remote 탭에 우클릭하여 Add Remote Host로 연결할 외부서버를 추가합니다.

 

 

✳️ VisualVM에  jmx 추가

추가한 Remote 서버에 우클릭하여 jmx를 추가합니다. (Add jmx Connection..)

위에서 임의로 추가한 포트번호만 뒤에 작성해주면 됩니다.

 

📌 Use security credential 항목은 체크❌
📌 Do not require SSL connection 항목을 체크⭕ - SSL 접속을 하지 않게

 

 

 

✳️ 모니터링 시작

위에서 .sh 프로세스 실행파일을 정상적으로 작동한 상태라면 여기에 모니터링이 표시됩니다.

(동그라미 친 아이콘쪽에 불이안들어와 있고 흑백으로 표시되면, 연결되지 않은것이니 확인하세요)

.sh 프로세스가 종료된 상태

jmx 포트로 연결한 파일을 하나씩 선택하여 모니터링하고, 부하테스트 결과로 캡쳐하여 활용할 수 있습니다.

728x90
반응형