APM/Scouter

[자바 트러블슈팅 공부] Scouter 그래프 보는 법 및 Xlog 보는 방법

대기업 가고 싶은 공돌이 2024. 12. 31. 22:39

본 게시글은 이상민 저자의 자바 트러블슈팅 책을 읽고 공부한 내용을 정리한 글이다.

 

그래프 보는 법

  • 상단 오른쪽에 초록색 화살표 두 개가 맞물린 버튼이 있다.
  • 그래프는 처음 추가했을 때부터의 데이터를 제공하는데, 저 버튼을 누르면 5분 간의 데이터를 확인할 수 있다.
  • 그래프에 오른쪽 마우스를 클릭하면 다음과 같은 메뉴가 나타난다.

  • 과거 데이터, 하루치 데이터, 누적된 데이터의 확인이 가능하다.
    • Total이라고 된 메뉴는 누적 그래프를 제공하며
      • 두 개 이상의 인스턴스를 모니터링할 경우 전체 인스턴스의 값이 합쳐진 그래프가 나온다.

화면 전환하기

  • 스카우터를 사용해서 서버 두 개 이상의 서비스를 모니터링할 때 하나의 화면으로 모니터링하는 것은 거의 불가능하다.
  • 그래서 Perspective 기능이 제공된다.
  • 클라이언트 화면 오른쪽 상단에 다음과 같은 메뉴가 있다.

이 부분에서 Save As를 클릭하자 "demo"라는 이름으로 새로운 서버를 입력해줬다.

 

이후 왼쪽의 갈라진 버튼을 클릭하면

  • 이렇게 옵션이 나타나는데, service를 클릭하고 open을 누르면 두 개의 창을 번갈아가며 볼 수 있게 된다.

  • 이제 demo의 화면을 새로운 서버에 맞게 커스텀 했다면, 반드시 그 화면을 저장해야한다.
  • 해당 Perspective를 선택한 후 마우스 오른쪽 버튼을 눌러 Save As를 클릭한 후 이름을 변경하기 않고 저장하면 된다.
  • 덮어쓰기 할 건지 물어보는 알림 창이 뜨는데, 여기서 Yes 버튼을 누르면 화면을 저장할 수 있다.

서버 묶어서 보기

  • 스카우터는 기본적으로 다음의 조건으로 묶어서 그래프들을 제공한다.
    • 같은 수집 서버에 자바 인스턴스들
    • 같은 수집서버에 톰캣 인스턴스들
  • 하지만 같은 수집 서버의 자바 인스턴스와 톰캣 인스턴스의 메모리 사용량을 하나의 그래프에서 보고 싶을 수도 있고
  • 서로 다른 수집 서버를 사용하지만 같은 역할을 하는 서버를 하나의 그래프에서 보고 싶을 수도 있을 것이다.
  • 이럴 때 Groups 메뉴를 사용한다.
  • Group 메뉴는 Scouter 상단에 있는 Management ->  Group Navigation을 선택하면 사용할 수 있다.

Scouter XLog

scouter에서 XLog는 아주 중요하고 큰 역할을 한다.

각각의 트랜잭션을 분석하고 시스템의 전반적인 상황을 한 눈에 볼 수 있는 산포도이기 때문이다.

 

XLog 사용법 - 기초

  • 사용자가 서비스에 요청을 하면 점들이 찍히게 된다.
  • 하나의 점은 하나의 요청을 의미한다.
  • 점들이 아래쪽에 깔려있으면, 해당 서비스는 매우 안정적인 상태라고 할 수 있다.
    • 왜냐하면 Y축은 응답 속도를 의미하기 때문이다.
  • 이 점들은 언제 화면에 찍히게 될까?
    1. 사용자가 서버에 요청했을 때
    2. 사용자의 요청이 끝났을 때
    3. 사용자에게 응답을 시작할 때
    4. 사용자에게 응답을 완료했을 때
  • 여기서 4번째 응답을 완료하였을 때, 정확히는 마지막 바이트까지 응답하여 요청이 끝났을 때 점이 찍힌다.
  • XLog의 방향키
    • 위쪽 방향키를 누르면 Y축의 값이 커지면서, 그래프가 압축되는 것 처럼 보인다.
    • 아래쪽 방향키를 누르면 반대로 Y축의 값이 작아지면서 확대된다.
    • 왼쪽 방향키를 누르면 이전 시간대의 트랜잭션을 확인할 수 있다.
    • 오른쪽 방향키를 누르면 앞 시간대로 이동이 가능하다.

  • 시간대를 이동하면 다음과 같이 검은 점이 생긴다. 해당 점의 의미는 현재 보고 있는 시점이
    가장 최근 시점이 아니라는 의미다.
  • 해당 검은 점을 누르면 다시 가장 최근 시점으로 이동할 수 있다.
  • x축을 늘리거나 줄이고 싶다면 Xlog 상단 오른쪽에 있는 돋보기 모양 아이콘을 클릭하면 된다.
  • 트랜잭션이 몇 만개인 상황에서 계속 x축을 늘리면 메모리가 부족해지는 현상이 발생할 수 있다.

  • 오른쪽 상단에 위치한 이 count는 5분 동안의 요청 개수를 의미한다.

XLog 세부 목록

자 이 밑에 깔려 있는 점들을 드래그 하면 세부 목록을 확인할 수 있다.

  • Object: 어느 인스턴스에서 발생한 것인지 알려준다.
  • Service: URL을 확인 가능하다.
  • Elapsed: 응답 속도이다.

여기서 Elapsed 순으로 정렬하면 가장 속도가 느린 것을 찾아낼 수 있다. 제목을 클릭하면 정렬 된다.

  • CPU: CPU 점유 시간, 단위는 밀리초이다.
  • SQL Count: SQL문 수행 개수
  • SQL Time: SQL 수행 시간, 단위는 밀리초이다.
  • API Count: API 호출 개수
  • API Time: API 호출 수행 시간, 단위 밀리초
  • KBytes: 요청을 수락하고 종료할 때까지 스레드에서 사용한 메모리의 양, 단위 키로바이트
  • txid: 고유한 트랜잭션 아이디로 다른 트랜잭션과 구분한다.
  • thread: 요청을 수행한 스레드의 이름이다.
  • ipaddr: was에 요청을 한 서버의 IP다. 만약 앞 단에 웹 서버가 있다면, 웹 서버의 IP가 이 값으로 설정된다.
  • userid: scouter에서 내부적으로 관리하는 사용자의 아이디다.
  • group: 사용자의 요청을 묶어서 구분하는 그룹을 지정할 수 있다. 별도의 설정을 하지 않으면 모두 하나의 그룹으로 관리된다.

Xlog 사용법 - 프로파일링

이제는 트랜잭션 내부의 프로파일링 결과를 살펴보자

  • p#: 부모의 순번
  • p: 현재 순번
  • Time: 해당 프로파일링이 호출된 시간
  • T-GAP: 위에 있는 프로파일링 결과와 현재 프로파일링 결과 사이의 시간 간격
  • CPU: CPU 사용 시간
  • CONTENT: 프로파일 내용

부모의 순번이 잘 이해가 안 간다. 부모의 순번이란, 한 api가 다른 api를 호출 했을 때 발생한다.

만약 0001에서 다른 api를 호출 했다면,

부모의 순번이 0001 이며 현재 순번이 0002인 프로파일링 결과가 나타날 것이다.

 

예시를 하나 살펴보자

   -        0002   52   ~~~~831ms ...

0002    0003   9     ~~~~1ms ...

   -        0004   857 ~~~~~~~

 

여기서 1번 라인의 처리 시간은 831ms 이다. 그런데 왜 3번 라인에서 TGAP이 857로 나온 것일까?

그 이유는 처리시간 + 대기시간이 존재하기 때문이다. 요청 처리 이후, 스레드 대기 시간, 리소스 대기 시간

등등의 이유로 처리시간에 부가적인 시간이 추가되어 TGAP이 완성 된다.

 

메서드 프로파일링 추가하기

방금 코드에서 대기 시간은 약 857 - 831로 26ms라고 추측된다. 그렇다면 그 시간을 자세하게 분석할 수는 없을까?

메서드 프로파일링 기능을 사용하면 자세하게 분석이 가능하다.

 

  • scouter Object 화면에서 Tomcat -> Configure을 누르자
  • 이후 원하는 내용을 설정한 후 오른쪽 위 저장을 누르자.
### scouter java agent configuration sample
obj_name=WAS-01
net_collector_ip=127.0.0.1
net_collector_udp_port=6100
net_collector_tcp_port=6100
#hook_method_patterns=sample.mybiz.*Biz.*,sample.service.*Service.*
#trace_http_client_ip_header_key=X-Forwarded-For
#profile_spring_controller_method_parameter_enabled=false
#hook_exception_class_patterns=my.exception.TypedException
#profile_fullstack_hooked_exception_enabled=true
#hook_exception_handler_method_patterns=my.AbstractAPIController.fallbackHandler,my.ApiExceptionLoggingFilter.handleNotFoundErrorResponse
#hook_exception_hanlder_exclude_class_patterns=exception.BizException
  • 여기서 hook method access protected enabled, hook method access none enabled
    을 주석 해제해서 true로 설정해주면 된다.
  • 여기서 가장 중요한 것은 hook method patterns 부분이다.
    • 이 옵션은 자바 에이전트의 핵심이다. 전체 패키지 이름.클래스.메서드이름 을 지정해주면 
      해당 메서드의 실행 시간을 분석할 수 있도록 프로파일링 결과에 표시해준다.
    • 만약 ***로 설정한 경우 모든 클래스의 모든 메서드에 대해서 프로파일링을 진행한다.