본 게시글은 이상민 저자의 자바 트러블슈팅 책을 읽고 공부한 내용을 정리한 글이다.
그래프 보는 법
- 상단 오른쪽에 초록색 화살표 두 개가 맞물린 버튼이 있다.
- 그래프는 처음 추가했을 때부터의 데이터를 제공하는데, 저 버튼을 누르면 5분 간의 데이터를 확인할 수 있다.
- 그래프에 오른쪽 마우스를 클릭하면 다음과 같은 메뉴가 나타난다.
- 과거 데이터, 하루치 데이터, 누적된 데이터의 확인이 가능하다.
- Total이라고 된 메뉴는 누적 그래프를 제공하며
- 두 개 이상의 인스턴스를 모니터링할 경우 전체 인스턴스의 값이 합쳐진 그래프가 나온다.
- Total이라고 된 메뉴는 누적 그래프를 제공하며
화면 전환하기
- 스카우터를 사용해서 서버 두 개 이상의 서비스를 모니터링할 때 하나의 화면으로 모니터링하는 것은 거의 불가능하다.
- 그래서 Perspective 기능이 제공된다.
- 클라이언트 화면 오른쪽 상단에 다음과 같은 메뉴가 있다.
이 부분에서 Save As를 클릭하자 "demo"라는 이름으로 새로운 서버를 입력해줬다.
이후 왼쪽의 갈라진 버튼을 클릭하면
- 이렇게 옵션이 나타나는데, service를 클릭하고 open을 누르면 두 개의 창을 번갈아가며 볼 수 있게 된다.
- 이제 demo의 화면을 새로운 서버에 맞게 커스텀 했다면, 반드시 그 화면을 저장해야한다.
- 해당 Perspective를 선택한 후 마우스 오른쪽 버튼을 눌러 Save As를 클릭한 후 이름을 변경하기 않고 저장하면 된다.
- 덮어쓰기 할 건지 물어보는 알림 창이 뜨는데, 여기서 Yes 버튼을 누르면 화면을 저장할 수 있다.
서버 묶어서 보기
- 스카우터는 기본적으로 다음의 조건으로 묶어서 그래프들을 제공한다.
- 같은 수집 서버에 자바 인스턴스들
- 같은 수집서버에 톰캣 인스턴스들
- 하지만 같은 수집 서버의 자바 인스턴스와 톰캣 인스턴스의 메모리 사용량을 하나의 그래프에서 보고 싶을 수도 있고
- 서로 다른 수집 서버를 사용하지만 같은 역할을 하는 서버를 하나의 그래프에서 보고 싶을 수도 있을 것이다.
- 이럴 때 Groups 메뉴를 사용한다.
- Group 메뉴는 Scouter 상단에 있는 Management -> Group Navigation을 선택하면 사용할 수 있다.
Scouter XLog
scouter에서 XLog는 아주 중요하고 큰 역할을 한다.
각각의 트랜잭션을 분석하고 시스템의 전반적인 상황을 한 눈에 볼 수 있는 산포도이기 때문이다.
XLog 사용법 - 기초
- 사용자가 서비스에 요청을 하면 점들이 찍히게 된다.
- 하나의 점은 하나의 요청을 의미한다.
- 점들이 아래쪽에 깔려있으면, 해당 서비스는 매우 안정적인 상태라고 할 수 있다.
- 왜냐하면 Y축은 응답 속도를 의미하기 때문이다.
- 이 점들은 언제 화면에 찍히게 될까?
- 사용자가 서버에 요청했을 때
- 사용자의 요청이 끝났을 때
- 사용자에게 응답을 시작할 때
- 사용자에게 응답을 완료했을 때
- 여기서 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 부분이다.
- 이 옵션은 자바 에이전트의 핵심이다. 전체 패키지 이름.클래스.메서드이름 을 지정해주면
해당 메서드의 실행 시간을 분석할 수 있도록 프로파일링 결과에 표시해준다. - 만약 ***로 설정한 경우 모든 클래스의 모든 메서드에 대해서 프로파일링을 진행한다.
- 이 옵션은 자바 에이전트의 핵심이다. 전체 패키지 이름.클래스.메서드이름 을 지정해주면
'APM > Scouter' 카테고리의 다른 글
[자바 트러블슈팅 공부] XLog(필터링, 통계), PlugIn, Scouter 사용시 유용한 팁 (0) | 2025.01.15 |
---|---|
[자바 트러블슈팅 공부] 각종 메뉴와 필수 그래프 항목 (2) | 2024.12.27 |
[자바 트러블슈팅 공부] scouter와 SpringBoot 연동 ( + 파일들의 역할) (0) | 2024.12.24 |
[자바 트러블슈팅 공부] APM이란?, 스카우터 기본 세팅 (1) | 2024.12.19 |