JProfiler 도움말Download

비동기 및 원격 요청 추적


작업의 비동기 실행은 일반 Java 코드에서뿐만 아니라 반응형 프레임워크에서도 일반적인 관행입니다. 소스 파일에서 인접한 코드는 이제 두 개 이상의 다른 스레드에서 실행됩니다. 디버깅 및 프로파일링을 위해 이러한 스레드 변경은 두 가지 문제를 제시합니다. 한편으로는 호출된 작업이 얼마나 비용이 드는지 명확하지 않습니다. 다른 한편으로는 비용이 많이 드는 작업을 실행을 유발한 코드로 추적할 수 없습니다.

JProfiler는 호출이 동일한 JVM에 남아 있는지 여부에 따라 이 문제에 대한 다양한 솔루션을 제공합니다. 비동기 실행이 호출한 동일한 JVM에서 발생하는 경우 "Inline Async Executions" 호출 트리 분석은 호출 사이트와 실행 사이트를 모두 포함하는 단일 호출 트리를 계산합니다. 원격 JVM에 요청이 있는 경우 호출 트리에는 호출 사이트와 실행 사이트로의 하이퍼링크가 포함되어 있어 관련 JVM에 대한 프로파일링 세션을 표시하는 JProfiler 최상위 창 간에 원활하게 탐색할 수 있습니다.

비동기 및 원격 요청 추적 활성화

비동기 메커니즘은 다양한 방식으로 구현될 수 있으며 별도의 스레드 또는 다른 JVM에서 작업을 시작하는 의미를 일반적인 방식으로 감지할 수 없습니다. JProfiler는 여러 일반적인 비동기 및 원격 요청 기술을 명시적으로 지원합니다. 요청 추적 설정에서 이를 활성화하거나 비활성화할 수 있습니다. 기본적으로 요청 추적은 활성화되어 있지 않습니다. 세션이 시작되기 직전에 표시되는 세션 시작 대화 상자에서 요청 추적을 구성할 수도 있습니다.

JProfiler의 메인 창에서 상태 표시줄은 일부 비동기 및 원격 요청 추적 유형이 활성화되어 있는지 여부를 표시하고 구성 대화 상자로의 바로 가기를 제공합니다.

JProfiler는 프로파일된 JVM에서 활성화되지 않은 비동기 요청 추적 유형이 사용되는지 감지하고 상태 표시줄의 비동기 및 원격 요청 추적 아이콘 옆에  알림 아이콘을 표시합니다. 알림 아이콘을 클릭하면 감지된 추적 유형을 활성화할 수 있습니다. 비동기 및 원격 요청 추적은 상당한 오버헤드를 발생시킬 수 있으며 필요한 경우에만 활성화해야 합니다.

비동기 추적

적어도 하나의 비동기 추적 유형이 활성화된 경우 CPU, 할당 및 프로브 녹화를 위한 호출 트리 및 핫스팟 뷰는 활성화된 모든 추적 유형에 대한 정보를 표시하고 "Inline Async Executions" 호출 트리 분석을 계산하는 버튼을 제공합니다. 해당 분석의 결과 뷰에서는 모든 비동기 실행의 호출 트리가  "비동기 실행" 노드를 통해 호출 사이트와 연결됩니다. 기본적으로 비동기 실행 측정값은 호출 트리의 상위 노드에 추가되지 않습니다. 때로는 집계된 값을 보는 것이 유용하기 때문에 분석 상단의 체크박스를 통해 적절한 경우 이를 수행할 수 있습니다.

다른 스레드에서 작업을 오프로드하는 가장 간단한 방법은 새 스레드를 시작하는 것입니다. JProfiler를 사용하면 "Thread start" 요청 추적 유형을 활성화하여 스레드의 생성부터 실행 사이트까지 스레드를 추적할 수 있습니다. 그러나 스레드는 무거운 객체이며 일반적으로 반복 호출을 위해 재사용되므로 이 요청 추적 유형은 디버깅 목적으로 더 유용합니다.

다른 스레드에서 작업을 시작하는 가장 중요하고 일반적인 방법은 java.util.concurrent 패키지의 실행기를 사용하는 것입니다. 실행기는 비동기 실행을 처리하는 많은 고급 타사 라이브러리의 기반이기도 합니다. 실행기를 지원함으로써 JProfiler는 멀티 스레드 및 병렬 프로그래밍을 처리하는 전체 클래스의 라이브러리를 지원합니다.

위의 일반적인 경우 외에도 JProfiler는 JVM용 두 가지 GUI 툴킷인 AWT와 SWT도 지원합니다. 두 툴킷은 단일 스레드로, GUI 위젯을 조작하고 그리기 작업을 수행할 수 있는 특별한 이벤트 디스패치 스레드가 있습니다. GUI를 차단하지 않으려면 백그라운드 스레드에서 장기 실행 작업을 수행해야 합니다. 그러나 백그라운드 스레드는 종종 진행 상황이나 완료를 표시하기 위해 GUI를 업데이트해야 합니다. 이는 이벤트 디스패치 스레드에서 실행될 Runnable을 예약하는 특별한 메서드를 사용하여 수행됩니다.

GUI 프로그래밍에서는 원인과 결과를 연결하기 위해 여러 스레드 변경을 따라야 하는 경우가 많습니다. 사용자는 이벤트 디스패치 스레드에서 작업을 시작하고, 이는 차례로 실행기를 통해 백그라운드 작업을 시작합니다. 완료 후, 해당 실행기는 이벤트 디스패치 스레드에 작업을 푸시합니다. 마지막 작업이 성능 문제를 일으키면 이는 원래 이벤트에서 두 번의 스레드 변경이 발생한 것입니다.

마지막으로 JProfiler는 모든 Kotlin 백엔드에 대해 구현된 Kotlin의 멀티 스레딩 솔루션인 Kotlin 코루틴을 지원합니다. 비동기 실행 자체는 코루틴이 시작되는 지점입니다. Kotlin 코루틴의 디스패치 메커니즘은 유연하며 실제로 현재 스레드에서 시작하는 것을 포함할 수 있으며, 이 경우 "비동기 실행" 노드에는 노드의 텍스트에 별도로 보고되는 인라인 부분이 있습니다.

중단 메서드는 실행을 중단할 수 있으며, 이는 다른 스레드에서 다시 시작될 수 있습니다. 중단이 감지된 메서드에는 실제 호출 횟수와 메서드의 의미적 호출 횟수를 보여주는 툴팁이 있는 추가  "중단" 아이콘이 있습니다. Kotlin 코루틴은 의도적으로 중단될 수 있지만 스레드에 바인딩되지 않기 때문에 대기 시간은 호출 트리 어디에도 나타나지 않습니다. 코루틴 실행이 완료될 때까지 소요된 총 시간을 확인하기 위해 "비동기 실행" 노드 아래에 코루틴의 전체 중단 시간을 캡처하는  "중단된" 시간 노드가 추가됩니다. 비동기 실행의 CPU 시간 또는 실제 시간에 관심이 있는지 여부에 따라 분석 상단의 "중단된 시간 표시" 체크박스를 사용하여 이러한 노드를 실시간으로 추가하거나 제거할 수 있습니다.

프로파일되지 않은 호출 사이트 추적

기본적으로 실행기 및 Kotlin 코루틴 추적은 호출 사이트가 프로파일된 클래스에 있는 비동기 실행만 추적합니다. 이는 프레임워크 및 라이브러리가 이러한 비동기 메커니즘을 사용하여 직접적으로 코드 실행과 관련이 없는 방식으로 사용할 수 있으며, 추가된 호출 및 실행 사이트가 오버헤드와 혼란을 초래할 수 있기 때문입니다. 그러나 프로파일되지 않은 호출 사이트를 추적하는 사용 사례가 있습니다. 예를 들어, 프레임워크가 Kotlin 코루틴을 시작하고 그 위에서 코드가 실행되는 경우입니다.

프로파일되지 않은 클래스에서 이러한 호출 사이트가 감지되면 호출 트리 및 핫스팟 뷰의 추적 정보에 해당 알림 메시지가 표시됩니다. 라이브 세션에서는 이러한 뷰에서 직접 실행기 및 Kotlin 코루틴 추적을 위해 프로파일되지 않은 호출 사이트 추적을 개별적으로 켤 수 있습니다. 이러한 옵션은 세션 설정 대화 상자의 "CPU 프로파일링" 단계에서 언제든지 변경할 수 있습니다.

Kotlin 코루틴은 CPU 녹화가 활성화된 동안 시작된 경우에만 추적할 수 있음을 이해하는 것이 중요합니다. 나중에 CPU 녹화를 시작하면 Kotlin 코루틴의 비동기 실행은 인라인될 수 없습니다. JProfiler는 프로파일되지 않은 클래스에서 호출 사이트를 감지한 경우와 마찬가지로 알림을 제공합니다. 애플리케이션 시작 시 시작되는 장기 실행 코루틴을 프로파일링해야 하는 경우 attach 모드를 사용하는 것은 옵션이 아닙니다. 이 경우 -agentpath VM 매개변수로 JVM을 시작하고 시작 시 CPU 녹화를 시작하십시오.

원격 요청 추적

선택된 통신 프로토콜에 대해 JProfiler는 메타데이터를 삽입하고 JVM 경계를 넘어 요청을 추적할 수 있습니다. 지원되는 기술은 다음과 같습니다:

  • HTTP: HttpURLConnection, java.net.http.HttpClient, Apache Http Client 4.x, Apache Async Http Client 4.x, OkHttp 3.9+ 클라이언트 측, Servlet-API 구현 또는 Jetty(서블릿 없이) 서버 측
  • Jersey Async Client 2.x, RestEasy Async Client 3.x, Cxf Async Client 3.1.1+의 비동기 JAX-RS 호출에 대한 추가 지원
  • 웹 서비스: JAX-WS-RI, Apache Axis2 및 Apache CXF
  • RMI
  • gRPC
  • 원격 EJB 호출: JBoss 7.1+ 및 Weblogic 11+

JProfiler에서 요청을 추적하려면 두 VM을 프로파일링하고 별도의 JProfiler 최상위 창에서 동시에 열어야 합니다. 이는 라이브 세션과 스냅샷 모두에서 작동합니다. 대상 JVM이 현재 열려 있지 않거나 원격 호출 시 CPU 녹화가 활성화되지 않은 경우 호출 사이트 하이퍼링크를 클릭하면 오류 메시지가 표시됩니다.

원격 요청을 추적할 때 JProfiler는 관련 JVM의 호출 트리에서 호출 사이트와 실행 사이트를 명시적으로 표시합니다. JProfiler의 호출 사이트는 기록된 원격 요청이 수행되기 전의 마지막 프로파일된 메서드 호출입니다. 이는 다른 VM에 위치한 실행 사이트에서 작업을 시작합니다. JProfiler는 호출 트리 뷰에 표시된 하이퍼링크를 사용하여 호출 사이트와 실행 사이트 간에 이동할 수 있도록 합니다.

호출 사이트는 모든 스레드에 대해 원격 요청 추적과 관련하여 동일한 ID를 가집니다. 이는 호출 사이트에서 실행 사이트로 또는 그 반대로 이동할 때 스레드 해상도가 없으며 이동 시 항상 "모든 스레드 그룹" 및 "모든 스레드 상태" 스레드 상태 선택이 활성화되어 대상이 표시된 트리의 일부가 되도록 보장됨을 의미합니다.

호출 사이트와 실행 사이트는 1:n 관계에 있습니다. 호출 사이트는 여러 실행 사이트에서 원격 작업을 시작할 수 있으며, 특히 서로 다른 원격 VM에 있는 경우 그렇습니다. 동일한 VM에서는 단일 호출 사이트에 대한 여러 실행 사이트가 발생할 가능성이 적습니다. 호출 스택이 다를 때만 발생할 수 있기 때문입니다. 호출 사이트가 둘 이상의 실행 사이트를 호출하는 경우 대화 상자에서 하나를 선택할 수 있습니다.

실행 사이트는 특정 호출 사이트에 의해 시작된 모든 실행을 포함하는 호출 트리의 합성 노드입니다. 실행 사이트 노드의 하이퍼링크를 통해 해당 호출 사이트로 돌아갈 수 있습니다.

동일한 호출 사이트가 동일한 실행 사이트를 반복적으로 호출하는 경우 실행 사이트는 모든 호출의 병합된 호출 트리를 표시합니다. 원하지 않는 경우 예외적인 메소드 기능을 사용하여 호출 트리를 더 분할할 수 있습니다. 아래 스크린샷에 표시된 대로입니다.

단일 호출 사이트에서만 참조되는 실행 사이트와 달리 호출 사이트 자체는 여러 실행 사이트에 연결될 수 있습니다. 호출 사이트의 숫자 ID를 통해 다른 실행 사이트에서 참조되는 경우 동일한 호출 사이트를 인식할 수 있습니다. 또한 호출 사이트는 원격 VM의 ID를 표시합니다. 프로파일된 VM의 ID는 상태 표시줄에서 볼 수 있습니다. 이는 JProfiler가 내부적으로 관리하는 고유 ID가 아니라 JProfiler에서 열리는 각 새로운 프로파일된 VM에 대해 1부터 시작하여 증가하는 표시 ID입니다.