JProfiler 도움말

프로브 개념

JProfiler용 커스텀 프로브를 개발하려면 몇 가지 기본 개념과 용어를 알아야 합니다. 모든 JProfiler 프로브의 공통 기반은 특정 메서드를 가로채고, 가로챈 메서드 파라미터 및 기타 데이터 소스를 사용하여 JProfiler UI에서 보고 싶은 흥미로운 정보를 담은 문자열을 만드는 것입니다.

프로브를 정의할 때 처음 마주치는 문제는, 어떤 메서드를 가로챌지 지정하고 문자열을 만들기 위해 메서드 파라미터 및 관련 객체를 사용할 수 있는 환경을 어떻게 얻을 것인가입니다. JProfiler에서는 이를 위한 세 가지 방법이 있습니다:

  • 스크립트 프로브는 JProfiler UI에서 완전히 정의됩니다. 호출 트리에서 메서드를 우클릭하고, 스크립트 프로브 액션을 선택한 후 내장 코드 에디터에서 문자열에 대한 표현식을 입력할 수 있습니다. 프로브 실험에는 좋지만, 커스텀 프로브의 기능 중 극히 일부만 노출됩니다.
  • 임베디드 프로브 API는 직접 작성한 코드에서 호출할 수 있습니다. 라이브러리, 데이터베이스 드라이버, 서버 등을 작성할 때 프로브를 제품에 포함시킬 수 있습니다. JProfiler로 해당 제품을 프로파일링하는 누구나 자동으로 프로브가 JProfiler UI에 추가됩니다.
  • 인젝티드 프로브 API를 사용하면, IDE에서 JProfiler 프로브 시스템의 모든 기능을 활용하여 3rd party 소프트웨어용 프로브를 작성할 수 있습니다. 이 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 데이터와 마찬가지로, 페이로드는 호출 트리 또는 핫스팟 뷰에서 볼 수 있습니다. 핫스팟에서는 어떤 페이로드가 가장 많은 시간 소모의 원인인지 보여주고, 백트레이스에서는 어떤 코드가 해당 페이로드를 생성했는지 알 수 있습니다. 좋은 핫스팟 목록을 얻으려면, 페이로드 문자열에 고유 ID나 타임스탬프가 포함되지 않아야 합니다. 모든 페이로드 문자열이 다르면 누적이 되지 않아 핫스팟 분포가 명확하지 않습니다. 예를 들어, prepared JDBC statement의 경우 파라미터를 페이로드 문자열에 포함시키지 않아야 합니다.

스크립트 프로브는 구성된 스크립트의 반환값으로 자동으로 페이로드를 생성합니다. 인젝티드 프로브도 비슷하게, PayloadInterception 어노테이션이 달린 인터셉션 핸들러 메서드에서 문자열이나 Payload 객체로 페이로드 설명을 반환합니다. 임베디드 프로브는 Payload.exit를 페이로드 설명과 함께 호출하여 페이로드를 생성하며, Payload.enterPayload.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) 버튼 아래에서 찾을 수 있습니다.

텔레메트리 메서드는 초당 한 번씩 폴링됩니다. Telemetry 어노테이션에서 단위와 스케일 팩터를 설정할 수 있습니다. line 속성을 사용하면 여러 텔레메트리를 하나의 텔레메트리 뷰로 결합할 수 있습니다. TelemetryFormatstacked 속성을 사용하면 선을 누적하여 스택형 선 그래프로 표시할 수 있습니다. 임베디드 및 인젝티드 프로브의 텔레메트리 관련 API는 동일하지만, 각 프로브 타입에만 적용됩니다.

제어 객체

때로는 프로브 이벤트를 JProfiler에서 "제어 객체(control object)"라고 부르는 연관된 장기 객체와 연결하는 것이 흥미로울 수 있습니다. 예를 들어, 데이터베이스 프로브에서는 쿼리를 실행하는 실제 커넥션이 해당 역할을 합니다. 이러한 제어 객체는 임베디드 API와 인젝티드 프로브 API로 열고 닫을 수 있으며, 프로브 이벤트 뷰에 해당 이벤트가 생성됩니다. 프로브 이벤트가 생성될 때 제어 객체를 지정하면, 해당 프로브 이벤트가 프로브의 "제어 객체" 뷰에 표시되는 통계에 반영됩니다.

제어 객체는 열릴 때 표시 이름을 지정해야 합니다. 프로브 이벤트 생성 시 새로운 제어 객체가 사용된다면, 프로브 설정에 이름 해석기를 제공해야 합니다.

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

녹화

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

마찬가지로, 트리거 액션에서 모든 커스텀 프로브(All custom probes)를 선택하여 프로브 녹화 시작/중지 트리거로 사용할 수 있습니다.

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