JProfiler 도움말

프로브 개념

JProfiler용 커스텀 프로브를 개발하려면 몇 가지 기본 개념과 용어를 알고 있어야 합니다. JProfiler의 모든 프로브의 공통적인 기본 원리는 특정 메서드를 가로채고(intercept), 가로챈 메서드 파라미터 및 기타 데이터 소스를 사용하여 JProfiler UI에서 확인하고자 하는 유용한 정보가 포함된 문자열을 구성한다는 것입니다.

프로브를 정의할 때 가장 먼저 마주하는 문제는 가로챌 메서드를 지정하고 문자열을 구성하는 데 메서드 파라미터 및 기타 관련 객체를 사용할 수 있는 환경을 얻는 방법입니다. JProfiler에서는 이를 수행하는 세 가지 방법이 있습니다.

  • 스크립트 프로브는 JProfiler UI에서 완전히 정의됩니다. 호출 트리에서 메서드를 마우스 우클릭하고 스크립트 프로브 액션을 선택한 다음 내장된 코드 편집기에서 문자열에 대한 표현식을 입력할 수 있습니다. 이는 프로브를 실험해 보기에 매우 좋지만, 커스텀 프로브 기능의 매우 제한된 부분만 제공합니다.
  • 임베디드 프로브 API는 자체 코드에서 호출할 수 있습니다. 라이브러리, 데이터베이스 드라이버 또는 서버를 작성하는 경우 제품과 함께 프로브를 제공할 수 있습니다. JProfiler로 귀하의 제품을 프로파일하는 모든 사용자는 JProfiler UI에 프로브가 자동으로 추가되는 이점을 누릴 수 있습니다.
  • 인젝티드 프로브 API를 사용하면 IDE에서 JProfiler 프로브 시스템의 모든 기능을 활용하여 서드파티 소프트웨어용 프로브를 작성할 수 있습니다. 이 API는 어노테이션을 사용하여 가로채기를 정의하고 메서드 파라미터 및 기타 유용한 객체를 주입합니다.
프로파일된 JVMJProfiler UI스크립트프로브프로파일된 애플리케이션프로파일링에이전트임베디드프로브주입된프로브

다음 질문은 다음과 같습니다. 생성된 문자열로 JProfiler가 무엇을 해야 할까요? 여기에는 페이로드 생성 또는 호출 트리 분할이라는 두 가지 전략을 사용할 수 있습니다.

페이로드 생성

프로브에 의해 구성된 문자열은 프로브 이벤트를 생성하는 데 사용될 수 있습니다. 이 이벤트에는 해당 문자열로 설정된 설명, 가로챈 메서드의 호출 시간과 동일한 듀레이션, 그리고 연관된 호출 스택이 포함됩니다. 해당하는 호출 스택에서 프로브 설명과 타이밍이 누적되어 페이로드로 호출 트리에 저장됩니다. 이벤트는 특정 최대 수 이후에 통합되지만, 호출 트리의 누적된 페이로드는 전체 녹화 기간 동안의 총 수치를 보여줍니다. CPU 데이터와 프로브가 모두 녹화 중인 경우, 프로브 호출 트리 뷰에는 페이로드 문자열이 리프 노드로 포함된 병합된 호출 스택이 표시되며, CPU 호출 트리 뷰에는 프로브 호출 트리 뷰로 연결되는 어노테이션 링크가 포함됩니다.

메서드 1메서드 2페이로드페이로드 A, 개수 3, 시간 600 ms페이로드 B, 개수 2, 시간 300 ms메서드 3페이로드 A, 시간 200 ms페이로드 A, 시간 100 ms페이로드 A, 시간 300 ms페이로드 B, 시간 100 ms페이로드 B, 시간 200 ms호출 트리와 주석이 달린 페이로드프로브 이벤트...연대기누적된

CPU 데이터와 마찬가지로 페이로드는 호출 트리 또는 핫스팟 뷰에 표시될 수 있습니다. 핫스팟은 소요된 시간의 대부분을 차지하는 페이로드를 보여주며, 역추적(back trace)은 코드의 어느 부분이 이러한 페이로드를 생성하는지 보여줍니다. 적절한 핫스팟 목록을 얻으려면 페이로드 문자열에 고유 ID나 타임스탬프가 포함되지 않아야 합니다. 모든 페이로드 문자열이 다르면 누적되지 않고 명확한 핫스팟 분포가 나타나지 않기 때문입니다. 예를 들어 JDBC PreparedStatement의 경우 파라미터는 페이로드 문자열에 포함되지 않아야 합니다.

스크립트 프로브는 구성된 스크립트의 반환값으로부터 페이로드를 자동으로 생성합니다. 인젝티드 프로브도 유사하여 PayloadInterception으로 어노테이션된 가로채기 핸들러 메서드에서 페이로드 설명을 문자열로 반환하거나 고급 기능을 위한 Payload 객체로 반환합니다. 반면 임베디드 프로브는 페이로드 설명을 인수로 전달하여 Payload.exit를 호출함으로써 페이로드를 생성하며, 여기서 Payload.enter와 Payload.exit 사이의 시간이 프로브 이벤트 듀레이션으로 기록됩니다.

페이로드 생성은 서로 다른 호출 사이트에서 발생하는 서비스 호출을 녹화할 때 가장 유용합니다. 대표적인 예로는 페이로드 문자열이 쿼리 문자열이나 명령 형태인 데이터베이스 드라이버가 있습니다. 프로브는 측정 대상 작업이 다른 소프트웨어 컴포넌트에 의해 수행되는 호출 사이트의 관점을 취합니다.

호출 트리 분할

프로브는 실행 사이트의 관점을 취할 수도 있습니다. 이 경우 가로챈 메서드가 어떻게 호출되는지는 중요하지 않으며, 그 이후에 어떤 메서드 호출이 실행되는지가 중요합니다. 대표적인 예로는 추출된 문자열이 URL인 서블릿 컨테이너용 프로브가 있습니다.

이제 페이로드를 생성하는 것보다 프로브가 구성한 각각의 고유한 문자열에 대해 호출 트리를 분할하는 기능이 더 중요해집니다. 이러한 각 문자열에 대해 해당하는 모든 호출의 누적된 호출 트리를 포함하는 분할 노드가 호출 트리에 삽입됩니다. 분할 노드가 없다면 단 하나의 누적된 호출 트리만 존재하겠지만, 이제 호출 트리를 별도로 분석할 수 있는 서로 다른 부분으로 분할하는 노드 세트가 생성됩니다.

메서드 1, 1 호출, 1400 ms메서드 2, 3 호출, 200 ms메서드 3, 1 호출, 400 ms메서드 2, 1 호출, 700 ms메서드 3, 2 호출, 100 ms문자열 A 분할문자열 B 분할호출 트리와 분할호출 트리와 분할 없음메서드 1, 1 호출, 1400 ms메서드 2, 4 호출, 900 ms메서드 3, 3 호출, 500 ms

여러 프로브가 중첩된 분할을 생성할 수 있습니다. 단일 프로브는 기본적으로 하나의 분할 레벨만 생성하지만, 재진입 가능(reentrant)으로 구성된 경우는 예외입니다(스크립트 프로브에서는 지원되지 않음).

JProfiler UI에서 호출 트리 분할은 스크립트 프로브 기능과 묶여 있지 않고 "Split methods"라는 별도의 기능으로 제공됩니다. 이 기능은 페이로드를 생성하지 않고 호출 트리만 분할하므로 이름과 설명이 포함된 프로브 뷰가 필요하지 않습니다. 인젝티드 프로브는 SplitInterception으로 어노테이션된 가로채기 핸들러 메서드에서 분할 문자열을 반환하며, 임베디드 프로브는 분할 문자열을 사용하여 Split.enter를 호출합니다.

텔레메트리

커스텀 프로브에는 이벤트 빈도와 평균 이벤트 듀레이션이라는 두 가지 기본 텔레메트리가 있습니다. 인젝티드 프로브와 임베디드 프로브는 프로브 구성 클래스의 어노테이션된 메서드로 생성되는 추가 텔레메트리를 지원합니다. JProfiler UI에서 스크립트 텔레메트리는 스크립트 프로브 기능과 독립적이며, 툴바의 Configure Telemetries 버튼 아래 "Telemetries" 섹션에서 찾을 수 있습니다.

텔레메트리 메서드는 초당 한 번씩 폴링됩니다. Telemetry 어노테이션에서 단위와 배율(scale factor)을 구성할 수 있습니다. line 속성을 사용하면 여러 텔레메트리를 단일 텔레메트리 뷰로 결합할 수 있습니다. TelemetryFormat의 stacked 속성을 사용하면 선을 가산형으로 만들어 누적 꺾은선 그래프로 표시할 수 있습니다. 임베디드 및 인젝티드 프로브의 텔레메트리 관련 API는 동등하지만 각 프로브 유형에만 적용 가능합니다.

제어 객체

때로는 프로브 이벤트를 JProfiler에서 "제어 객체"라고 부르는 관련 수명이 긴 객체에 연결하는 것이 유용할 수 있습니다. 예를 들어 데이터베이스 프로브에서는 쿼리를 실행하는 물리적 커넥션이 그 역할을 담당합니다. 이러한 제어 객체는 프로브 이벤트 뷰에서 해당 이벤트를 생성하는 임베디드 API 및 인젝티드 프로브 API를 통해 열고 닫을 수 있습니다. 프로브 이벤트가 생성될 때 제어 객체를 지정할 수 있으므로, 해당 프로브 이벤트는 프로브의 "Control objects" 뷰에 표시되는 통계에 반영됩니다.

제어 객체에는 열릴 때 지정해야 하는 표시 이름이 있습니다. 프로브 이벤트를 생성할 때 새 제어 객체가 사용되는 경우, 프로브 구성에서 이름 확인자(name resolver)를 제공해야 합니다.

또한 프로브는 enum 클래스를 통해 커스텀 이벤트 유형을 정의할 수 있습니다. 프로브 이벤트가 생성될 때 이러한 유형 중 하나를 지정할 수 있으며, 이는 단일 이벤트 유형별로 필터링할 수 있는 이벤트 뷰에 표시됩니다. 더 중요한 점은 제어 객체를 시간 축에 선으로 표시하는 프로브의 타임라인 뷰가 이벤트 유형에 따라 색상화된다는 것입니다. 커스텀 이벤트 유형이 없는 프로브의 경우, 색상화는 이벤트가 기록되지 않는 유휴 상태와 프로브 이벤트가 지속되는 기본 이벤트 상태를 보여줍니다. 커스텀 유형을 사용하면 예를 들어 "read" 및 "write"와 같은 상태를 구분할 수 있습니다.

녹화

모든 프로브와 마찬가지로 커스텀 프로브는 기본적으로 데이터를 녹화하지 않으며, 필요에 따라 녹화를 활성화하거나 비활성화해야 합니다. 프로브 뷰에서 수동 시작/중지 액션을 사용할 수도 있지만, 처음에 프로브 녹화를 켜야 하는 경우가 많습니다. JProfiler는 커스텀 프로브를 미리 알 수 없기 때문에 녹화 프로파일에는 모든 커스텀 프로브에 적용되는 Custom probes 체크박스가 있습니다.

마찬가지로 프로브 녹화를 시작하고 중지하는 트리거 액션에 대해 All custom probes를 선택할 수 있습니다.

프로그래밍 방식의 녹화의 경우, Controller.startProbeRecording(Controller.PROBE_NAME_ALL_CUSTOM, ProbeRecordingOptions.EVENTS)를 호출하여 모든 커스텀 프로브를 녹화하거나, 더 구체적으로 지정하기 위해 프로브의 클래스 이름을 전달할 수 있습니다.