인스턴스 성능 관리
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리
애플리케이션의 환경을 확인하고 성능과 관련한 설정을 확인할 수 있습니다.
에이전트 목록
화면 왼쪽에 애플리케이션 목록에서는 프로젝트에 할당된 에이전트 목록을 확인할 수 있습니다. 개별 에이전트 항목을 선택하면 오른쪽 화면에 설정된 환경 변수 및 에이전트 설 정, 성능과 관련한 정보를 조회할 수 있습니다.
에이전트 목록을 갱신하거나 비활성화된 에이전트를 재기동한 다음 목록에 자동으로 표시되지 않는다면 버튼을 선택하세요.
에이전트 및 애플리케이션 상세 정보
화면 오른쪽에서는 에이전트 및 애플리케이션과 관련한 상세 정보를 확인할 수 있습니다.
-
오른쪽 위에 텍스트 입력란을 통해 원하는 항목을 필터링할 수 있습니다.
-
모니터링 대상 서버에 위치한 에이전트 및 애플리케이션의 변경 사항이 자동 반영되지 않는다면 새로고침 버튼을 선택하세요.
에이전트 관련 항목
실행 환경 변수
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 실행 환경 변수
에이전트 실행과 관련한 환경 변수를 조회할 수 있습니다. 에이전트 버전 및 설치 경로, 이름, IP 주소 등을 확인할 수 있습니다.
에이전트 로그
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 에이전트 로그
모니터링 대상 서버에 저장된 에이전트 로그를 조회할 수 있습니다. 로그 파일의 이름은 whatap-YYYYMMDD
.log 형식입니다. 각 로그를 선택해 로그에 캡쳐되는 오류 및 이벤트에 대한 정보를 액세스할 수 있습니다.
로그와 관련한 에이전트 설정은 다음 문서를 참조하세요.
에이전트 설정
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 에이전트 설정 Old
모니터링 대상 서버에 위치한 whatap.conf 파일을 직접 수정하지 않고 에이전트 설정 옵션을 추가하거나 수정, 삭제할 수 있습니다.
에이전트 설정 기능은 사용성과 기능을 개선한 관리 > 에이전트 설정 메뉴를 이용할 것을 권장합니다. 화면 오른쪽 위에 신규 에이전트 설정 버튼을 선택하세요. 자세한 내용은 다음 문서를 참조하세요.
애플리케이션 관련 항목
환경변수
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 환경변수
애플리케이션 실행과 관련한 환경 변수 정보를 조회할 수 있습니다.
힙 히스토그램
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 힙 히스토그램
JVM(자바 가상 머신)의 메모리에 올라가 있는 Heap 점유 객체 현황(힙 메모리상의 객체별 사이즈)을 조회할 수 있습니다.
Java 6 ~ 8 버전에서는 JVM 옵션 없이 기본 지원하지만, 일부 Java 버전에 따라 다음과 같이 JVM 옵션을 적용해야 합니다.
-
Java 9 ~ Java 15 버전
-Djdk.attach.allowAttachSelf=true
examplejava -javaagent:{WHATAP_HOME}/whatap.agent-X.Y.Z.jar -Djdk.attach.allowAttachSelf=true -jar {application.jar}
-
Java 16 버전 이상
-Djdk.attach.allowAttachSelf=true
--add-opens=jdk.attach/sun.tools.attach=ALL-UNNAMEDexamplejava -javaagent:{WHATAP_HOME}/whatap.agent-X.Y.Z.jar -Djdk.attach.allowAttachSelf=true --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=jdk.attach/sun.tools.attach=ALL-UNNAMED -jar {application.jar}
-
Java 5 버전 이하, IBM Java는 지원하지 않습니다.
로딩된 클래스
홈 화면 > 프 로젝트 선택 > 인스턴스 성능 관리 > 로딩된 클래스
Java 애플리케이션에 로딩된 클래스 정보를 확인할 수 있습니다.
라이브러리 버전
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 라이브러리 버전
Java 애플리케이션을 구성하는 라이브러리의 버전을 확인할 수 있습니다.
스레드 목록/덤프
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 스레드 목록/덤프
Java 프로세스의 모든 스레드 상태에 대한 스냅샷 정보를 확인할 수 있습니다. Java 애플리케이션의 성능 문제를 진단하는데 이용할 수 있습니다. 스레드 목록에서 각 스레드의 버튼을 선택하면 스레드 덤프 정보를 확인할 수 있습니다. 자세한 내용은 다음 문서를 참조하세요.
소켓 오픈 개수
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 소켓 오픈 개수
Java 애플리케이션이 TCP 기능을 수행하기 위해 오픈한 소켓(Socket) 정보를 확인할 수 있습니다.
메소드 성능 상태
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 메소드 성능 상태
Java 애플리케이션에서 수행 중인 메소드(Method)의 상세 정보를 확인할 수 있습니다.
데이터소스 상태
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 데이터소스 상태
데이터소스(DataSource)의 상태를 확인할 수 있습니다.
시스템 GC
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 시스템 GC
JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체(garbage)를 모아 제거할 수 있습니다. 실행 버튼을 선택하면 GC 프로세스를 실행하게 되며, 실행 전 후의 메모리 용량을 확인할 수 있습니다.
힙 덤프
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 힙 덤프
Java 애플리케이션 실행 중 메모리 누수 등의 문제가 발생하면 관련된 문제를 정리하여 덤프 파일을 생성할 수 있습니다. 힙 덤프 확보 버튼을 선택하세요.
이 기능은 Java 에이전트 1.5.2 버전 이상에서 지원합니다. 에이전트 설정에서 heapdump_enabled
옵션을 true
로 설정하세요. 힙 덤프 확보 버튼을 선택해 힙 덤프 파일을 만드는 기능을 활성화합니다. 매번 힙 덤프를 자동 생성하지 않으며 해당 옵션이 성능에 영향을 주진 않습니다. 그러나 덤프 확보 작업은 성능에 영향을 미칠 수 있습니다.
힙 덤프 확보 작업은 부하가 큰 작업에 속합니다. 부하와 별개로 힙 덤프가 모두 추출될 때까지 애플리케이션의 코드는 실행이 중지(stop the world)되기 때문에 사용자가 느끼는 성능 차이는 더 심할 수 있습니다.
쓰로틀링 설정
홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 쓰로틀링 설정
Java 애플리케이션의 부하량 제어와 관련한 에이전트 설정을 확인하고 옵션을 설정할 수 있습니다. 부하량 제어와 관련한 에이전트 설정에 대한 자세한 내용은 다음 문서를 참조하세요.
스레드 덤프 분석하기
스레드 목록/덤프 탭에서 확인할 수 있는 정보에 대해 안내합니다.
스레드 상태
스레드의 상태는 java.lang.Thread
클래스 내부에 State
라는 이름의 Enumerated Types(열거형)으로 선언된 항목들입니다.
-
NEW
: 스레드가 생성되었지만 아직 실행되지 않은 상태입니다. -
RUNNABLE
: 현재 CPU를 점유하고 작업을 수행 중인 상태입니다. 운영체제의 자원 분배로WAITING
상태가 될 수도 있습니다. -
WAITING
:wait()
,join()
,park()
메소드 등를 이용해 대기하고 있는 상태입니다. -
TIMED_WAITING
:sleep()
,wait()
,join()
,park()
메소드 등을 이용해 대기하고 있는 상태,WAITING
상태와 다른 점은 주어진 시간 동안 대기하고 있는 상태입니다. 외부적인 변화 뿐만 아니라 시간에 의해서도 대기 상태가 해제될 수 있습니다. -
BLOCKED
: 사용하려는 개체의 락(Lock)이 풀릴 때까지 대기하고 있는 상태입니다. -
TERMINATED
: 실행을 마친 상태입니다.
스레드 덤프 정보
스레드 목록에서 각 스레드의 버튼을 선택하면 스레드 덤프 정보를 확인할 수 있습니다.
스택
항목 | 속성 | 설명 |
---|---|---|
스레드 ID | threadId | 스레드에 할당된 고유 ID |
Lock 소유주 ID | lockOwnerId | 스레드가 차단된 개체의 모니터(Monitor) 잠금을 유지하는 스레드 ID |
대기수 | waitedCount | 스레드가 WAITING 또는 TIMED_WAITING 상태가 된 총 횟수 |
블록 개수 | blockedCount | 스레드가 BLOCKED 상태가 된 총 횟수 |
대기 시간 | waitedTime | 스레드가 WAITING 상태를 지속한 경과 시간(밀리초), 스레드 경합 모니터링이 비활성화된 경우 -1 반환 |
스레드 CPU 시간 | threadCpuTime | 스레드의 CPU 시간 합계(나노초)를 밀리초로 계산하여 표시, CPU 시간 측정을 비활성화한 경우 -1 반환 |
상태 | threadstate | 스레드 상태 |
블록 시간 | blockedTime | 스레드가 BLOCKED 상태가 된 후 경과 시간(밀리초), 스레드 경합 모니터링이 비활성화된 경우 -1 반환 |
스레드 명 | threadName | 스레드 고유 이름 |
Lock 이름 | lockName | 스레드의 입력이 차단되거나 Object.wait 메소드를 통해 통지를 기다리는 모니터 잠금을 표시한 문자열 |
Lock 소유주 이름 | lockOwnerName | 스레드가 차단되는 객체의 모니터 잠금을 수용하는 스레드 이름 |
스레드 사용자 시간 | threadUserTime | 스레드가 사용자 모드에서 실행한 CPU 시간(나노초)을 밀리초로 계산하여 표시 |
스레드 정보에 대한 자세한 내용은 다음 링크를 참조하세요.
Stack 추적
예외가 발생했을 때 스택(Stack) 추적을 표시합니다. 스택 프레임 목록으로 코드가 호출한 메소드 정보가 포함되어 있습니다.