본문으로 건너뛰기

인스턴스 성능 관리

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리

애플리케이션의 환경을 확인하고 성능과 관련한 설정을 확인할 수 있습니다. 에이전트 및 애플리케이션과 관련한 상세 정보를 확인할 수 있습니다.

  • 오른쪽 위에 텍스트 입력란을 통해 원하는 항목을 필터링할 수 있습니다.

  • 모니터링 대상 서버에 위치한 에이전트 및 애플리케이션의 변경 사항이 자동 반영되지 않는다면 새로 고침 아이콘 새로고침 버튼을 선택하세요.

노트

에이전트 목록

화면 왼쪽에 애플리케이션 목록에서는 프로젝트에 할당된 에이전트 목록을 확인할 수 있습니다. 개별 에이전트 항목을 선택하면 오른쪽 화면에 설정된 환경 변수 및 에이전트 설정, 성능과 관련한 정보를 조회할 수 있습니다.

에이전트 목록

에이전트 목록을 갱신하거나 비활성화된 에이전트를 재기동한 다음 목록에 자동으로 표시되지 않는다면 새로 고침 아이콘 버튼을 선택하세요.

실행 환경 변수

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 실행 환경 변수

실행 환경 변수

에이전트 실행과 관련한 환경 변수를 조회할 수 있습니다. 환경 변수 중 중요한 정보 또는 애플리케이션의 상태 정보를 와탭 서버에 저장해 에이전트가 다운되더라도 조회가 가능합니다. 에이전트 버전 및 설치 경로, 이름, IP 주소 등을 확인할 수 있습니다. CSV 다운로드 버튼 클릭 시 환경 변수 정보를 다운로드할 수 있습니다. 주요 확인 사항은 다음과 같습니다.

  • (애플리케이션).version: 애플리케이션 버전을 확인할 수 있습니다.

  • file.encoding: utf-8과 같은 파일 인코딩 형식을 확인할 수 있습니다.

  • os.name: OS를 확인할 수 있습니다.

  • user.language: 사용자 언어를 확인할 수 있습니다.

  • -Xms, -Xms: 힙 메모리 설정 관련 환경 변수를 확인할 수 있습니다.

  • (애플리케이션).start: 애플리케이션 시작 시간을 확인할 수 있습니다.

환경 변수

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 환경변수

환경 변수

애플리케이션 실행과 관련한 환경 변수 정보를 조회할 수 있습니다. 환경 변수 메뉴는 조회 시점의 환경 변수 정보를 수집해 제공합니다. System.getProperty()를 사용해 매개변수로 전달된 키의 값을 조회합니다. 주요 확인 사항은 다음과 같습니다.

  • (애플리케이션).version: 애플리케이션 버전을 확인할 수 있습니다.

  • file.encoding: utf-8과 같은 파일 인코딩 형식을 확인할 수 있습니다.

  • 애플리케이션 상태 정보: 예를 들어 catalina.home 환경 변수가 조회될 경우 tomcat 환경임을 파악할 수 있습니다.
  • OS 환경 변수: 예를 들어 (env) LANG 환경 변수와 같이 접미사 (env) 형식으로 제공됩니다.

힙 히스토그램

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 힙 히스토그램

힙 히스토그램

JVM(자바 가상 머신)의 메모리에 올라가 있는 Heap 점유 객체 현황(힙 메모리상의 객체별 사이즈)을 조회할 수 있습니다. 즉 객체의 순수 크기를 조회합니다. 건수 컬럼을 통해 주요 객체들의 개수 확인이 용이합니다.

노트

GC 전까지 유지되는 객체의 개수를 조회하기 때문에 실제로 사용되고 있지 않더라도 해당 목록에는 표시됩니다. 정확한 조회를 위해 시스템 GC 실행 후 해당 목록을 확인하는 것을 권장합니다. 시스템 GC에 대한 자세한 내용은 다음 문서를 참조하세요.

노트

Java 6 ~ 8 버전에서는 JVM 옵션 없이 기본 지원하지만, 일부 Java 버전에 따라 다음과 같이 JVM 옵션을 적용해야 합니다.

  • Java 9 ~ Java 15 버전

    -Djdk.attach.allowAttachSelf=true
    example
    java -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-UNNAMED
    example
    java -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 애플리케이션에 로딩된 클래스 정보를 확인할 수 있습니다. 로딩된 클래스 메뉴를 통해 애플리케이션에서 로딩된 클래스 목록과 관련 상세 데이터를 조회하고, 중단없이 클래스의 동작을 변경할 수 있습니다.

  • 클래스 상세: 조회 컬럼에서 상세 보기 아이콘 아이콘 클릭 시 클래스 상세를 확인할 수 있습니다. 클래스 상세는 클래스 내 메소드 및 상속 관계 정보를 제공합니다.

  • 재정의: 재정의 컬럼에서 수정 아이콘 아이콘 클릭 시 해당 클래스를 재정의할 수 있습니다. 런타임에 이미 로딩된 클래스를 다시 로딩 후 바이트 코드 삽입(BCI)을 통해 애플리케이션 중단없이 해당 클래스의 동작 변경이 가능합니다.

  • 리소스: 해당 클래스가 물리적으로 어느 파일에서 로딩되었는지 확인할 수 있습니다. 애플리케이션의 복잡한 다계층 구조 특성상 클래스가 정확히 어느 jar 파일에서 로딩되었는지 파악하는 리소스 정보 확인이 필요합니다.

재정의 기능과 리소스 정보 확인 활용에 대한 자세한 내용은 다음 문서를 참조하세요.

노트

BCI(ByteCode Instrumentation)

자바 바이트 코드는 플랫폼 독립적인 중간 코드로 JVM에서 실행됩니다. BCI 즉 바이트 코드 삽입은 소스 파일 수정 없이 런타임 또는 빌드 타임에 바이트 코드를 동적으로 변경하여 추가 기능을 구현하는 기술입니다. 자세한 내용은 다음 문서를 참조하세요.

라이브러리 버전

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 라이브러리 버전

라이브러리 버전

Java 애플리케이션에 배포된 컴포넌트 목록을 조회할 수 있습니다. 오픈 소스 라이브러리를 많이 사용하는 환경에서는 jar 파일의 버전 정보를 확인하여 호환성 문제를 신속히 식별하고 해결할 수 있습니다. 또한 버전 정보 확인은 보안 취약점이 있는 버전을 찾아 패치하는 등 보안 관리에도 용이합니다.

  • 컴포넌트 목록 정보: 해당 jar 파일의 이름 및 버전 정보를 상세에서 제공합니다.

  • CSV 다운로드: 다운로드 버튼을 클릭해 버전 정보를 다운로드할 수 있습니다.

스레드 목록/덤프

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 스레드 목록/덤프

스레드 목록/덤프

Java 프로세스의 모든 스레드 상태에 대한 스냅샷 정보를 제공합니다. 스레드 목록/덤프는 CPU 최적화 작업에 핵심적인 메뉴입니다. 프로세스가 아닌 스레드 단위로 상태를 확인함으로써 CPU 자원을 더욱 세밀하게 관리할 수 있습니다. 예를 들어 조회 시점에 CPU를 가장 많이 사용하고 있는 스레드 특정 후 해당 스레드의 스택 정보를 확인해 성능 문제를 식별할 수 있습니다.

  • 스레드 현황: 전체 스레드 개수 및 RUNNABLE, WAITING 상태의 스레드 개수를 목록 상단 현황 요약을 통해 확인할 수 있습니다.

  • 스레드 덤프: 상단 오른쪽의 스레드 덤프 버튼을 클릭해 전체 스레드 덤프를 생성할 수 있습니다. 전체 스레드 덤프 생성 후 스레드 목록 하단에서 해당 정보를 확인할 수 있습니다.

  • 개별 스레드 덤프: 각 스레드마다 확장 아이콘 아이콘 선택 시 개별 스레드 덤프 정보를 확인할 수 있습니다. 스택Stack 추적에서 스레드 상태와 실행 경로에 대한 세부 정보 및 스택 트레이스를 조회할 수 있습니다. 새로고침 아이콘 새로고침 해 확인할 수 있습니다. 자세한 내용은 다음 문서를 참조하세요.

  • 스레드 CPU 시간: 해당 스레드가 CPU를 점유한 누적 시간을 의미합니다. 밀리초 단위 시간을 사용합니다.

  • 증가량: 스레드 목록 상단에서 새로고침 아이콘 새로고침 아이콘을 클릭하면 기존 스레드 CPU 시간과 현재 스레드의 CPU 시간의 차잇값이 추가됩니다.

스레드 CPU 시간은 해당 스레드가 CPU를 점유한 총 누적 시간이기 때문에 조회 시점에 가장 많이 CPU를 사용하고 있는 스레드를 특정하기 위해서는 증가량 값 확인이 필요합니다. 자세한 내용은 다음 문서를 참조하세요.

노트

CPU 사용량 급증 유형

  • 힙 메모리가 가득 찬 경우: 잦은 GC로 CPU 사용량 급증

  • 실제 요청이 많은 경우: 대량의 클라이언트 요청 처리로 CPU 사용량 급증

  • 잘못된 코드 로직: 비효율적인 알고리즘이나 무한 루프로 CPU 사용량 급증

스레드 덤프 분석하기

스레드 목록/덤프 메뉴에서 확인할 수 있는 개별 스레드 덤프 정보에 대해 안내합니다.

스레드 상태

스레드의 상태는 java.lang.Thread 클래스 내부에 State라는 이름의 Enumerated Types(열거형)으로 선언된 항목들입니다.

  • NEW: 스레드가 생성되었지만 아직 실행되지 않은 상태입니다.

  • RUNNABLE: 현재 CPU를 점유하고 작업을 수행 중인 상태입니다. 운영체제의 자원 분배로 WAITING 상태가 될 수도 있습니다.

  • WAITING: wait(), join(), park() 메소드 등를 이용해 대기하고 있는 상태입니다.

  • TIMED_WAITING: sleep(), wait(), join(), park() 메소드 등을 이용해 대기하고 있는 상태, WAITING 상태와 다른 점은 주어진 시간 동안 대기하고 있는 상태입니다. 외부적인 변화 뿐만 아니라 시간에 의해서도 대기 상태가 해제될 수 있습니다.

  • BLOCKED: 사용하려는 개체의 락(Lock)이 풀릴 때까지 대기하고 있는 상태입니다.

  • TERMINATED: 실행을 마친 상태입니다.

스레드 덤프 정보

스레드 목록에서 각 스레드의 버튼을 선택하면 개별 스레드 덤프 정보를 확인할 수 있습니다.

스레드 덤프 정보

스택
항목속성설명
스레드 IDthreadId스레드에 할당된 고유 ID
Lock 소유주 IDlockOwnerId스레드가 차단된 개체의 모니터(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) 추적을 표시합니다. 스택 프레임 목록으로 코드가 호출한 메소드 정보가 포함되어 있습니다.

소켓 오픈 개수

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 소켓 오픈 개수

소켓 오픈 개수

Java 애플리케이션이 TCP 기능을 수행하기 위해 오픈한 소켓(Socket) 정보를 확인할 수 있습니다 이를 통해 애플리케이션 인스턴스가 데이터베이스와 같은 어떤 외부 시스템에 의존하는지 네트워크 의존성(Network Dependency)을 조회할 수 있습니다. 또한 누구와 아웃바운드 호출을 하고 있는지 추적할 수 있습니다. 이러한 정보는 TCP 통신의 효율성, 안정성 및 성능 최적화를 위해 중요합니다.

  • 건수: 외부 시스템에 대한 연결 시도 횟수를 의미합니다.

  • 스택: 스택 확보를 선택하여 다음 연결 시 확보한 스택을 조회 및 삭제할 수 있습니다.

건수 기준으로 정렬 후 호스트포트를 확인하여 어떤 서비스 또는 시스템과 연결이 많은지 확인할 수 있습니다. 이후 스택을 확보해 상세 내용을 조회해 보세요.

노트

데이터베이스와 커넥션 풀

예를 들어 3306 포트건수가 증가 시 커넥션 풀을 사용하지 않거나 또는 커넥션 풀을 빈번하게 끊고 다시 만드는 등 MySQL의 커넥션 관리가 올바르게 이루어지지 않는 상황일 가능성이 있습니다. 해당 3306 포트가 어떤 코드 경로에서 사용되고 있는지 파악하기 위해 스택을 확보하여 추적할 수 있습니다.

메소드 성능 상태

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 메소드 성능 상태

Java 애플리케이션에서 수행 된 메소드(Method)의 성능 통계 정보를 제공합니다.

  • 새로고침: 데이터를 재호출합니다.

  • 리셋: 등록된 메소드 통계 데이터를 초기화합니다.

노트

메소드 성능 상태 메뉴를 사용하려면 에이전트 설정 메뉴에서 다음 사용자 정의 옵션을 추가하세요. 그리고 재기동 또는 로딩된 클래스 메뉴에서 재정의하세요.

hook_method_stat_patterns=io.home.test.baseapp.app.post.mapper.PostMapperImpl.*

데이터소스 상태

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 데이터소스 상태

데이터소스 상태

데이터소스(DataSource)의 상태를 확인할 수 있습니다. 애플리케이션이 사용하는 데이터베이스 커넥션 풀의 현재 상태와 구성, 연결 설정 정보, 연결 상태 및 설정 불일치 여부 등의 정보를 제공합니다.

노트

커넥션 풀 객체의 생성과 동시에 모니터링이 시작되기 때문에 해당 객체가 사용되고 있지 않더라도 데이터소스 상태 정보에 나타날 수 있습니다.

에이전트 로그

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 에이전트 로그

에이전트 로그

모니터링 대상 서버에 저장된 에이전트 로그를 조회할 수 있습니다. 로그 파일의 이름은 whatap-YYYYMMDD.log 형식입니다. 각 로그를 선택해 로그에 캡쳐되는 오류 및 이벤트에 대한 정보를 액세스할 수 있습니다.

노트

로그와 관련한 에이전트 설정은 다음 문서를 참조하세요.

시스템 GC

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 시스템 GC

시스템 GC

System.gc()를 호출해 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요없게 된 메모리 객체(garbage)를 모아 제거할 수 있습니다. GC 실행 버튼을 선택하면 GC 프로세스를 실행하게 되며, 실행 전과 실행 후의 메모리 용량을 확인할 수 있습니다.

노트

-XX:+DisableExplicitGC와 같이 명시적인 GC 요청을 비활성화하는 옵션이 설정된 경우 시스템 GC가 동작하지 않습니다.

노트

시스템 GC와 메모리 누수

Heap 메모리 사용량이 지속적으로 상승할 때 메모리 누수의 가능성을 확인하고 정확하게 진단하기 위해 시스템 GC가 필요합니다.

  • 메모리 요청 유무: 애플리케이션이 지속적으로 메모리를 요청하고 있는 상태인지 확인합니다. 메모리 요청 증가가 예상치 이상인지 또는 메모리 해제가 정확히 이루어지고 있는지 살펴봅니다.

  • 메모리 사용량 확인: 실제로 메모리가 과다하게 사용되고 있는 상태인지 확인합니다. GC 수행으로 필요하지 않은 객체를 해제하고 메모리 사용량 변화를 살펴봅니다.

  • GC 주기: 메모리가 충분히 비어있는 상황임에도 GC가 수행되지 않는 상태인지 확인합니다. GC 주기 또는 설정을 살펴봅니다.

힙 덤프

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 힙 덤프

힙 덤프

Java 애플리케이션 실행 중 메모리 누수 등의 문제가 발생하면 관련된 문제를 정리하여 덤프 파일을 생성할 수 있습니다. 힙 덤프 확보 버튼을 선택하세요. 생성된 덤프 파일은 애플리케이션 서버에 저장됩니다. 에이전트를 설치한 경로 하위의 dump 디렉터리에서 확인할 수 있습니다.

노트

이 기능은 Java 에이전트 1.5.2 버전 이상에서 지원합니다. 에이전트 설정에서 heapdump_enabled 옵션을 true로 설정하세요. 힙 덤프 확보 버튼을 선택해 힙 덤프 파일을 만드는 기능을 활성화합니다. 매번 힙 덤프를 자동 생성하지 않으며 해당 옵션이 성능에 영향을 주진 않습니다. 그러나 덤프 확보 작업은 성능에 영향을 미칠 수 있습니다.

힙 덤프 확보 작업은 부하가 큰 작업에 속합니다. 부하와 별개로 힙 덤프가 모두 추출될 때까지 애플리케이션의 코드는 실행이 중지(stop the world)되기 때문에 사용자가 느끼는 성능 차이는 더 심할 수 있습니다.

쓰로틀링 설정

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 쓰로틀링 설정

쓰로틀링 설정

Java 애플리케이션의 부하량 제어와 관련한 에이전트 설정을 확인하고 옵션을 설정할 수 있습니다. 부하량 제어와 관련한 에이전트 설정에 대한 자세한 내용은 다음 문서를 참조하세요.

에이전트 설정 Old

홈 화면 > 프로젝트 선택 > 인스턴스 성능 관리 > 에이전트 설정 Old

모니터링 대상 서버에 위치한 whatap.conf 파일을 직접 수정하지 않고 에이전트 설정 옵션을 추가하거나 수정, 삭제할 수 있습니다. 설정 파일 다운로드 버튼 클릭 시 선택한 에이전트의 whatap.conf 파일을 다운로드합니다.

정보

에이전트 설정 기능은 사용성과 기능을 개선한 관리 > 에이전트 설정 메뉴를 이용할 것을 권장합니다. 화면 오른쪽 위에 신규 에이전트 설정 버튼을 선택하세요. 자세한 내용은 다음 문서를 참조하세요.