JProfiler 도움말

오프라인 프로파일링

JProfiler로 애플리케이션을 프로파일링하는 방법에는 근본적으로 두 가지가 있습니다. 기본적으로는 JProfiler GUI를 attach한 상태에서 프로파일링합니다. JProfiler GUI는 녹화를 시작하고 중지하는 버튼을 제공하며 녹화된 모든 프로파일링 데이터를 표시합니다.

JProfiler GUI 없이 프로파일링하고 나중에 결과를 분석하고 싶은 상황이 있습니다. 이러한 시나리오를 위해 JProfiler는 오프라인 프로파일링을 제공합니다. 오프라인 프로파일링을 사용하면 JProfiler GUI에 연결할 필요 없이 프로파일링 에이전트와 함께 프로파일된 애플리케이션을 시작할 수 있습니다.

그러나 오프라인 프로파일링에도 수행해야 할 작업이 있습니다. 적어도 하나의 스냅샷을 저장해야 하며, 그렇지 않으면 나중에 분석할 수 있는 프로파일링 데이터가 없습니다. 또한 CPU 또는 할당 데이터를 보려면 어느 시점에 녹화를 시작해야 합니다. 마찬가지로 저장된 스냅샷에서 힙 워커를 사용하려면 힙 덤프를 trigger해야 합니다.

프로파일링 API

이 문제에 대한 첫 번째 해결책은 컨트롤러 API입니다. API를 사용하면 코드에서 모든 프로파일링 작업을 프로그래밍 방식으로 호출할 수 있습니다. api/samples/offline 디렉토리에는 실제로 컨트롤러 API를 사용하는 방법을 보여주는 실행 가능한 예제가 있습니다. 해당 디렉토리에서 ../gradlew를 실행하여 컴파일하고 실행하고, Gradle 빌드 파일 build.gradle을 살펴보면 테스트 프로그램이 어떻게 호출되는지 이해할 수 있습니다.

Controller API는 런타임에 프로파일링 작업을 관리하기 위한 주요 인터페이스입니다. JProfiler 설치 경로의 bin/agent.jar에 포함되어 있거나 다음 좌표를 가진 Maven 의존성으로 사용할 수 있습니다.

group: com.jprofiler
artifact: jprofiler-probe-injected
version: <JProfiler version>

Maven Central 저장소에서 제공됩니다.

애플리케이션의 일반 실행 중에 프로파일링 API가 사용되면 API 호출은 아무런 동작도 하지 않고 조용히 무시됩니다.

이 방식의 단점은 개발 중에 애플리케이션의 클래스패스에 JProfiler 에이전트 library를 추가하고, 소스 코드에 프로파일링 지시문을 추가하며, 프로그래밍 방식의 프로파일링 작업을 변경할 때마다 코드를 다시 컴파일해야 한다는 것입니다.

Trigger

trigger를 사용하면 소스 코드를 수정하지 않고도 JProfiler GUI에서 모든 프로파일링 작업을 지정할 수 있습니다. Trigger는 JProfiler 설정 파일에 저장됩니다. 오프라인 프로파일링을 활성화하여 시작할 때 설정 파일과 session ID가 커맨드 라인을 통해 프로파일링 에이전트에 전달되므로, 프로파일링 에이전트는 해당 trigger 정의를 읽을 수 있습니다.

소스 코드에 API 호출을 추가하는 프로파일링 API와 달리, trigger는 JVM에서 특정 이벤트가 발생할 때 활성화됩니다. 예를 들어, 메서드의 시작이나 끝에 특정 프로파일링 작업을 위한 API 호출을 추가하는 대신 메서드 호출 trigger를 사용할 수 있습니다. 또 다른 사용 사례로, 주기적으로 스냅샷을 저장하기 위해 직접 타이머 스레드를 만드는 대신 타이머 trigger를 사용할 수 있습니다.

각 trigger에는 연관된 이벤트가 발생할 때 수행되는 작업 목록이 있습니다. 이러한 작업 중 일부는 컨트롤러 API의 프로파일링 작업에 해당합니다. 또한 파라미터와 반환값을 포함한 메서드 호출을 출력하는 작업이나 메서드에 대한 인터셉터 스크립트를 호출하는 작업과 같이 컨트롤러 기능을 넘어서는 다른 작업들도 있습니다.

오프라인 프로파일링 설정

JProfiler에서 실행 session을 설정한 경우, 메인 메뉴에서 Session→Conversion Wizards→Convert Application Session To Offline을 호출하여 오프라인 session으로 변환할 수 있습니다. 이렇게 하면 적절한 VM 파라미터가 포함된 시작 스크립트가 생성되고 JProfiler UI에서 사용하는 동일한 session의 프로파일링 설정이 적용됩니다. 다른 컴퓨터로 호출을 이동하려면 Session→Export Session Settings를 사용하여 session을 설정 파일로 내보내고, 시작 스크립트의 VM 파라미터가 해당 파일을 참조하는지 확인해야 합니다.

통합 마법사를 사용하여 애플리케이션 서버를 프로파일링할 때는 항상 시작 스크립트나 설정 파일이 수정되어 Java 호출에 프로파일링을 위한 VM 파라미터가 삽입됩니다. 모든 통합 마법사에는 대화형 프로파일링 대신 오프라인 프로파일링을 위해 애플리케이션 서버를 설정하기 위한 "Startup" 단계에 "Profile offline" 옵션이 있습니다.

예를 들어 통합 마법사에서 처리하지 않는 시작 스크립트가 있는 경우, Java 호출에 VM 파라미터를 직접 전달할 수 있습니다. 해당 VM 파라미터의 형식은 다음과 같습니다.

-agentpath:<path to jprofilerti library>=offline,id=<ID>[,config=<path>]

이 파라미터는 [Generic application] 마법사에서 확인할 수 있습니다.

library 파라미터로 offline을 전달하면 오프라인 프로파일링이 활성화됩니다. 이 경우 JProfiler GUI와의 연결은 불가능합니다. id 파라미터는 설정 파일에서 프로파일링 설정에 사용할 session을 결정합니다. session의 ID는 session 설정 대화상자의 Application settings 탭 오른쪽 상단에서 확인할 수 있습니다. 선택적 파라미터인 config는 설정 파일을 가리킵니다. 이 파일은 Session→Export Session Settings를 호출하여 내보낼 수 있습니다. 파라미터를 생략하면 표준 설정 파일이 사용됩니다. 해당 파일은 사용자 홈 디렉토리의 .jprofiler16 디렉토리에 있습니다.

일반적인 오프라인 session의 경우 idconfig를 생략하고 -agentpath 파라미터에 직접 session 설정을 지정할 수 있습니다. 예를 들면 다음과 같습니다.

-agentpath:<path to jprofilerti library>=offline,callTreeMode=sampling,profile=com.mycorp.:org.example.

사용 가능한 인라인 설정 목록은 시작 시 프로파일링 설정에 관한 도움말 항목을 참조하십시오. trigger나 probe별 설정과 같은 고급 설정이 필요한 경우에만 내보낸 설정 파일을 사용하십시오.

API 호출이나 jpcontroller 없이 스냅샷을 저장하기 위한 자동 녹화 옵션을 추가할 수도 있습니다.

-agentpath:<path to jprofilerti
library>=offline,snapshot=/path/to/snapshot.jps,recording=cpu:allocation,duration=10m

Gradle 및 Ant를 사용한 오프라인 프로파일링

Gradle 또는 Ant에서 오프라인 프로파일링을 시작할 때 해당 JProfiler 플러그인을 사용하면 작업을 더 쉽게 할 수 있습니다. 테스트 프로파일링을 위한 Gradle 태스크의 일반적인 사용 예는 다음과 같습니다.

plugins {
    id 'com.jprofiler' version 'X.Y.Z'
    id 'java'
}

jprofiler {
    installDir = file('/opt/jprofiler')
}

task run(type: com.jprofiler.gradle.TestProfile) {
    offline = true
    configFile = file("path/to/jprofiler_config.xml")
    sessionId = 1234
}

com.jprofiler.gradle.JavaProfile 태스크는 표준 JavaExec 태스크로 실행하는 것과 동일한 방식으로 Java 클래스를 프로파일링합니다. JProfiler에서 직접 지원하지 않는 다른 JVM 실행 방법을 사용하는 경우, com.jprofiler.gradle.SetAgentPathProperty 태스크를 사용하여 필요한 VM 파라미터를 프로퍼티에 쓸 수 있습니다. 이 태스크는 JProfiler 플러그인을 적용할 때 기본적으로 추가되므로 다음과 같이 간단히 작성할 수 있습니다.

setAgentPathProperty {
    propertyName = 'agentPathProperty'
    offline = true
    configFile = file("path/to/jprofiler_config.xml")
    sessionId = 1234
}

그런 다음 태스크가 실행된 후 다른 곳에서 프로젝트 프로퍼티 참조로 agentPathProperty를 사용할 수 있습니다. 모든 Gradle 태스크와 해당 Ant 태스크의 기능은 별도의 챕터에 자세히 설명되어 있습니다.

실행 중인 JVM에서 오프라인 프로파일링 활성화

커맨드 라인 유틸리티 bin/jpenable을 사용하면 버전 8 이상의 실행 중인 JVM에서 오프라인 프로파일링을 시작할 수 있습니다. VM 파라미터와 마찬가지로 offline 스위치, session ID 및 선택적 설정 파일을 지정해야 합니다.

jpenable --offline --id=12344 --config=/path/to/jprofiler_config.xml

일반적인 오프라인 session의 경우 --id--config를 인라인 session 설정으로 대체할 수 있습니다.

jpenable --offline --call-tree-mode=sampling --profile=com.mycorp.:org.example.

일회성 녹화도 동일한 방식으로 설정할 수 있습니다.

jpenable --offline --snapshot=/path/to/snapshot.jps --recording=cpu:allocation --duration=10m

이와 같이 호출하면 실행 중인 JVM 목록에서 프로세스를 선택해야 합니다. 추가 인수 --pid=<PID> --noinput을 사용하면 사용자 입력이 전혀 필요 없도록 프로세스를 자동화할 수 있습니다.

자동 녹화를 설정하지 않은 경우 수동으로 녹화를 시작하거나 스냅샷을 저장해야 할 수 있습니다. 이는 bin/jpcontroller 커맨드 라인 도구로 가능합니다.

프로파일링 에이전트만 로드되고 프로파일링 설정이 적용되지 않은 경우 녹화 작업을 켤 수 없으므로 jpcontroller가 연결할 수 없습니다. 여기에는 jpenable로 프로파일링을 활성화하되 offline 파라미터 없이 활성화하는 경우도 포함됩니다. 오프라인 모드를 활성화하면 프로파일링 설정이 지정되고 jpcontroller를 사용할 수 있습니다.

jpenable jpcontroller 실행 파일에 대한 자세한 정보는 커맨드 라인 레퍼런스에서 확인할 수 있습니다.