728x90
Oracle Solaris 11.4에서 JEUS6으로 운영 중인 웹 애플리케이션에서 대량 파일 업로드로 인한 과도한 액티브 상태 누적 문제를 진단하고 해결하기 위한 상세한 리포트 수집 방법을 설명해 드리겠습니다.
1. JEUS6 내부 진단 명령어
JEUS6은 jeusadmin 콘솔 툴을 통해 실시간으로 서버 상태를 모니터링할 수 있습니다.
1.1 스레드 상태 확인 (thread-info)
가장 먼저 실행해야 할 명령어로, 현재 활성화된 모든 스레드의 상태를 확인할 수 있습니다:
bash
[MASTER]domain1.adminServer> thread-info -server server1 -a
주요 옵션:
-
-server <server-name>: 모니터링 대상 서버 지정
-
-a, --all: 모든 스레드 풀 정보 확인
-
-s active: 활성 상태의 스레드만 필터링
-
-st, --stacktrace: 활성 스레드의 스택 트레이스 함께 출력
-
-os, --only-stats: 통계 정보만 간략히 확인
실행 예시:
bash
# 활성 스레드만 스택 트레이스와 함께 확인
thread-info -server server1 -s active -st
# 특정 웹 컨텍스트의 스레드만 확인
thread-info -server server1 -ctx /upload -s active
1.2 스택 트레이스 상세 확인 (print-stack-trace)
특정 스레드의 상세한 호출 스택을 확인할 때 사용합니다:
bash
Copy
[MASTER]domain1.adminServer> print-stack-trace -server server1 <thread-id>
실행 예시:
bash
# thread-info로 확인된 스레드 ID 123의 스택 트레이스 출력
print-stack-trace -server server1 123
1.3 서버 상태 확인 (server-info)
서버 전반의 상태와 스레드 풀 구성을 확인합니다:
bash
[MASTER]domain1.adminServer> server-info
출력 결과에서 Status, PID, Running Engines 등을 확인하여 서버 상태를 파악합니다.
1.4 시스템 스레드 풀 정보 (show-system-thread-pool)
시스템 전반의 스레드 풀 설정과 현황을 확인합니다:
bash
[MASTER]domain1.adminServer> show-system-thread-pool server1
2. JVM 레포트 수집 방법
2.1 프로세스 ID(PID) 확인
Solaris 11.4에서 JEUS6 프로세스의 PID를 확인합니다:
bash
ps -ef | grep jeus
# 또는
pgrep -f jeus.server
2.2 Thread Dump 생성 (jstack)
실행 중인 스레드의 상태를 스냅샷으로 저장합니다:
bash
# 방법 1: jstack 사용
jstack <PID> > /tmp/jeus_thread_dump_$(date +%Y%m%d_%H%M%S).txt
# 방법 2: kill -3 신호 (JVM이 SIGQUIT에 응답)
kill -3 <PID>
# 출력은 JEUS 로그 파일에 기록됨 (주: jeus.log 또는 server.log)
# 방법 3: jcmd 사용 (JDK 7 이상)
jcmd <PID> Thread.print > /tmp/thread_dump.txt
실행 주의사항:
-
Thread dump는 순간 상태를 캡처하므로, 문제 발생 시 여러 번(3-5회, 5초 간격) 수집해야 합니다
-
JEUS6은 JDK 6 이상을 사용하므로, 해당 JDK의 bin 디렉토리에 있는 도구를 사용해야 합니다
2.3 Heap Dump 생성 (jmap)
메모리 누수 여부를 확인하기 위해 힙 덤프를 생성합니다:
bash
# 힙 덤프 생성
jmap -dump:format=b,file=/tmp/jeus_heap_dump_$(date +%Y%m%d_%H%M%S).hprof <PID>
# 힙 메모리 사용 현황만 간단히 확인
jmap -heap <PID>
주의사항:
-
Heap dump 생성 시 애플리케이션이 잠시 멈출 수 있으므로, 서비스 영향 시간을 고려해야 합니다
-
파일 크기가 클 수 있으므로, 충분한 디스크 공간 확인이 필요합니다
2.4 GC 로그 분석
GC(Garbage Collection) 패턴을 분석하여 메모리 사용 패턴을 파악합니다:
bash
# JEUS 시작 스크립트에 다음 옵션 추가
JAVA_OPTS="$JAVA_OPTS -Xloggc:/tmp/jeus_gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
3. Solaris 11.4 특화 모니터링
3.1 Solaris DTrace 이용
Solaris 11.4의 강력한 추적 프레임워크를 활용합니다:
bash
# JEUS 프로세스의 시스템 콜 추적 (root 권한 필요)
dtrace -n 'syscall:::entry /pid == <PID>/ { @[probefunc] = count(); }'
# I/O 작업 모니터링
dtrace -n 'io:::start /pid == <PID>/ { @[execname] = count(); }'
3.2 Solaris 프로세스 상태 확인
bash
# 프로세스 자원 사용량 확인
prstat -p <PID> 1 10
# 프로세스가 열고 있는 파일 확인
pfiles <PID>
# 프로세스 메모리 맵 확인
pmap -x <PID>
4. 통합 리포트 수집 스크립트
문제 발생 시 자동으로 모든 정보를 수집하는 스크립트를 작성하는 것이 좋습니다:
bash
#!/bin/bash
# JEUS6_Diagnostics.sh
JEUS_PID=$(pgrep -f jeus.server.server1)
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
REPORT_DIR="/tmp/jeus_report_$TIMESTAMP"
mkdir -p $REPORT_DIR
echo "=== JEUS6 Diagnostics Report - $TIMESTAMP ===" > $REPORT_DIR/report_summary.txt
# 1. 서버 상태 정보
echo "1. Collecting server info..."
jeusadmin -u admin -p password -c "server-info" > $REPORT_DIR/server_info.txt 2>&1
# 2. 스레드 정보
echo "2. Collecting thread info..."
jeusadmin -u admin -p password -c "thread-info -server server1 -a -st" > $REPORT_DIR/thread_info.txt 2>&1
# 3. Thread Dump (3회, 5초 간격)
echo "3. Collecting thread dumps..."
for i in 1 2 3; do
jstack $JEUS_PID > $REPORT_DIR/thread_dump_$i.txt
sleep 5
done
# 4. Heap Summary
echo "4. Collecting heap summary..."
jmap -heap $JEUS_PID > $REPORT_DIR/heap_summary.txt
# 5. System resource usage
echo "5. Collecting system resources..."
prstat -p $JEUS_PID 1 5 > $REPORT_DIR/prstat.txt
pmap -x $JEUS_PID > $REPORT_DIR/pmap.txt
# 6. JEUS 로그 파일 복사 (최근 1000 라인)
echo "6. Collecting logs..."
tail -1000 $JEUS_HOME/domains/domain1/servers/server1/logs/jeus.log > $REPORT_DIR/jeus_log.txt
echo "=== Report collection completed: $REPORT_DIR ==="
5. 분석 및 해결 방안
5.1 스레드 덤프 분석
-
BLOCKED/WAITING 상태 스레드: 동기화 문제나 자원 부족 확인
-
대량 파일 업로드 관련 스레드: java.io.FileInputStream.read 또는 java.nio 관련 호출 확인
-
데이터베이스 커넥션: java.net.SocketInputStream.socketRead0 장시간 대기 여부
5.2 JEUS6 설정 조정
jeus.xml 또는 domain.xml에서 스레드 풀 설정을 조정합니다:
xml
<thread-pool>
<max-threads>200</max-threads>
<min-threads>50</min-threads>
<queue-size>4096</queue-size>
<keep-alive-time>30000</keep-alive-time>
</thread-pool>
5.3 모니터링 자동화
-
Nagios/Zabbix 통합: jeusadmin 명령어와 연동하여 임계값 알림 설정
-
로그 분석: JEUS 로그에서 STUCK, DEADLOCK 키워드 모니터링
이러한 방법들을 통해 사용자가 화면을 닫아도 계속 유지되는 액티브 상태의 원인을 정확히 파악하고, 장기적인 해결책을 마련할 수 있습니다.
728x90
'컴퓨터 활용(한글, 오피스 등) > 기타' 카테고리의 다른 글
| TCP Keep-Alive란 무엇이고 Oracle Solaris 11.4에서 설정하는 방법 (0) | 2025.12.16 |
|---|---|
| tmax.tibero.jdbc.comm.tbstream.readnbytes JDBC-90700 오류 해결 방법 (0) | 2025.12.16 |
| 연차사용촉진제도 운영 시 알아야 할 노무수령 거부 방법과 주의사항 총 정리 (0) | 2025.12.12 |
| 노무거부권 (0) | 2025.12.12 |
| 유지관리 방법론 (0) | 2025.12.07 |