X-View와 프로파일링

응답 시간 분포도와 X-View

응답 시간 분포도란 개별 트랜잭션의 종료 시간을 X 축으로, 응답 시간을 Y 축으로 한 점 차트를 말한다. 각 점은 트랜잭션을 의미하고 이 점을 선택해서 해당 트랜잭션에 대한 상세 수행 내역, 즉 프로파일을 조회할 수 있다. 제니퍼에서 응답시간 분포도를 X-View라고 부른다.

응답 시간 분포도 예

X-View 분포 패턴

성능 문제들은 비정상적인 응답 패턴으로 표출되는 경우가 있는데 그 중에서 알아두어야할 X-View 분포 패턴들에 대해서 설명한다.

단순 폭주 현상

단순 폭주 현상은 이벤트 행사 등의 원인으로 유명 상품 티켓 시스템에서 순간적으로 사용자가 증가할 때 관찰할 수 있는 패턴이다.

단순 폭주 현상

시루떡 현상

시루떡 현상은 서비스 요청이 폭주한 후에 시스템이 정상화되지 않을 때 관찰할 수 있는 패턴이다. 단순 폭주 현상과는 폭주 후 응답 시간 분포도 패턴이 다르다. 차트 중간에 가로선이 보이는데, 최초 폭주 직전부터 조금씩 가로 선의 개수가 많아지다가 폭주 후에는 확연하게 가로 선이 형성되는 것을 볼 수 있다. 이런 층 모양이 시루떡과 비슷해서 이 패턴을 시루떡 현상이라고 한다. 시루떡 현상에서는 선 여러 개가 계층적으로 형성되며 부하량이 많아질수록 가로 선 수가 늘어나는 특징이 있다.

시루떡 현상

단순하게 한 두개의 가로 선이 있는 경우에는 시루떡 현상이라고 부르지 않는다.

시루떡 현상은 트랜잭션이 특정 자원을 사용하는 과정에서 재시도와 기다림이 반복적으로 발생할 때 나타난다. 즉, 트랜잭션이 어떤 자원을 획득하고자 하는데 유효한 자원이 없어 일정 시간 기다리다가 다시 시도할 때 응답 시간의 다단계 층이 형성된다. 따라서 부하량이 많아질수록 자원 부족 현상이 빈번해지고 기다리는 시간만큼을 간격으로 가로 선이 형성된다.

폭포수 현상

폭포수 현상은 한계 상황에 민감하게 반응하는 자원이 존재할 때 관찰할 수 있는 패턴이다. 폭포수 현상에서는 반복적인 세로 선이 형성되는데, 특정 자원이 갑자기 한계 상황에 도달했다가 순간적으로 풀리면서 관련된 트랜잭션이 동시에 종료되는 현상이 반복될 때 발생할 수 있다.

폭포수 현상

물방울 현상

물방울 현상은 트랜잭션이 비 오는 날 바닥에서 물방울이 튀기듯이 형성되는 패턴을 지칭한다. 물방울 현상에서는 울퉁불퉁하고 짧은 세로 선이 여러 개 형성된다. 물방울 현상은 시스템에 병목이 존재하지만 부하량이 적어서 시스템 병목이 크게 표출되지 않을 때 발생 할 수 있다. 따라서 부하량이 많아지면 해당 병목은 치명적인 시스템 장애 원인이 될 수 있다.

물방울 현상

매트릭스 현상

매트릭스 현상은 영화 매트릭스 시작 화면처럼 점들 흘러 내리듯이 형성되는 패턴을 말한다. 매트릭스 현상은 짧고 빈번한 락 현상이 많은 트랜잭션에 걸쳐서 나타날 때 관찰된다. 하나의 락은 몇 개의 트랜잭션에만 영향을 미치고 이러한 락이 전체 애플리케이션 서비스에 불특정하게 나타나는 것이 특징이다. 예를 들어, 데이터베이스나 EJB 엔티티빈의 ISOLATION LEVEL이 높을 때 이 현상이 발생할 수 있다.

매트릭스 현상

파도치기 현상

파도치기 현상은 트랜잭션이 물결처럼 출렁이듯이 형성되는 패턴을 말한다. 성능 문제와 는 상관없이 서비스 요청이 많아졌다가 줄어들었다를 반복할 때 파도치기 현상이 발생할 수 있다. 그리고 트랜잭션이 사용하는 특정 자원이 부족할 때 발생할 가능성이 높다. 예를들어, 모니터링하는 애플리케이션과 연동하는 외부 시스템의 CPU 사용률이 100%에 육박할 때 파도치기 현상이 발생할 수 있다.

파도치기 현상

X-View 데이터

X-View 데이터 구성

제니퍼 서버가 트랜잭션 처리 결과에 대해서 수집하는 데이터를 X-View 데이터라고 하고, X-View 데이터는 트랜잭션 데이터와 프로파일 데이터로 이루어진다.

트랜잭션 데이터는 다음과 같이 구성된다.

트랜잭션 데이터

항목

설명

도메인

제니퍼 서버 도메인 이름

UUID

트랜잭션 고유 아이디

GUID

여러 트랜잭션을 하나의 그룹으로 묶을 때 사용하는 글로벌 키

에이전트

트랜잭션이 수행된 자바 애플리케이션의 제니퍼 에이전트 아이디

클라이언트 IP

트랜잭션을 요청한 클라이언트 컴퓨터의 IP 주소

클라이언트 아이디

HTTP 쿠키로 관리하는 클라이언트 고유 아이디

사용자 아이디

업무적인 의미를 갖는 사용자 아이디로 별도 설정이 필요하다.

서버 시간

트랜잭션 데이터를 제니퍼 서버가 수집한 시간으로 제니퍼 서버 시간을 기준으로 한다.

호출 시간

트랜잭션 시작 시간으로 제니퍼 에이전트를 설치한 자바 애플리케이션 시간을 기준으로 한다.

종료 시간

트랜잭션 종료 시간으로 제니퍼 에이전트를 설치한 자바 애플리케이션 시간을 기준으로 한다.

응답 시간

트랜잭션 종료 시간에서 트랜잭션 호출 시간을 뺀 것으로 트랜잭션이 수행되는데 걸린 시간을 의미한다. 단위는 밀리 세컨드이다.

CPU 시간

트랜잭션이 수행되는 과정에서 사용한 CPU 시간을 의미한다. 단위는 밀리 세컨드이다.

SQL 시간

트랜잭션이 수행되는 과정에서 SQL을 수행하는데 걸린 시간을 의미한다. 단위는 밀리 세컨드이다.

Fetch 시간

트랜잭션이 수행되는 과정에서 java.sql.ResultSet 객체의 next 메소드를 수행하는데 걸린 시간을 의미한다. 단위는 밀리 세컨드이다.

TX 시간

트랜잭션이 수행되는 과정에서 외부 트랜잭션을 수행하는데 걸린 시간을 의미한다. 단위는 밀리 세컨드이다.

클라이언트 응답 시간

웹 브라우저와 자바 애플리케이션 사이의 네트워크 시간으로 별도의 설정이 필요하다.

에러 항목

트랜잭션이 수행되는 과정에서 발생한 예외 유형(심각, 에러, 경고)

에러

트랜잭션이 수행되는 과정에서 발생한 예외 이름

애플리케이션

해당 트랜잭션의 애플리케이션 이름

프로파일 데이터는 여러 개 항목으로 구성된다. 프로파일 항목은 메소드 수행과 관련된 메소드 항목과 트랜잭션 처리 중에 발생한 특정 이벤트를 의미하는 메시지 항목으로 구성된다. 그리고 메시지 항목은 SQL, 파일, 소켓 등의 세부 항목으로 다시 구분된다.

프로파일 데이터 항목

항목

설명

메소드 항목

트랜잭션 처리 과정에서 수행된 메소드를 의미하며 프로파일 데이터 대부분을 차지한다.

SQL 항목

트랜잭션 처리 과정에서 수행된 SQL 작업을 의미한다.

파일 항목

트랜잭션 처리 과정에서 수행된 파일 작업을 의미한다.

소켓 항목

트랜잭션 처리 과정에서 수행된 소켓 작업을 의미한다.

메시지 항목

SQL, 파일, 소켓 항목을 제외한 메시지를 의미한다.

주요 메시지 항목

메시지

설명

FILE-WOPEN 파일명

쓰기 모드로 파일을 오픈

FILE-ROPEN 파일명

읽기 모드로 파일을 오픈

SOCKET-ISTREAM 주소

소켓에서 읽기 스트림 오픈

SOCKET-OSTREAM 주소

소켓에서 쓰기 스트림 오픈

[cpu] GET-CONNECTION 메소드

혹은 데이타소스 [시간ms]

트랜잭션이 데이터베이스 커넥션을 커넥션 풀에서 획득하거나 새로운 연결을 맺음

[cpu] CLOSE-CONNECTION

데이터베이스 커넥션을 커넥션 풀에 반환하거나 CLOSE 함

[cpu] FETCH 패치 건수/누적 패치건수 [시간 ms]

데이터베이스에서 데이터를 FETCH. FETCH 시간은 Gap 시간에 포함되고 FETCH 항목 CPU 누적 시간은 FETCH시 소요한 CPU 시간을 포함한다.

[cpu] TX-CALL 외부 트랜잭션 이름 [시간 ms]

외부 트랜잭션 수행

THREAD-INIT 쓰레드명

새로운 서브 쓰레드 시작

PARAM 값

메소드 파라미터 값

RETURN 값

메소드 반환 값

[cpu] SQL-PREPARE_STMT{n}

PreparedStatement 객체 생성

[cpu] SQL-PREPARE_CALL{n}

CallableStatement 객체 생성

[cpu] SQL-EXECUTE-QUERY{n} [시간 ms]

{n}의 executeQuery 메소드가 수행됨

[cpu] SQL-EXECUTE-UPDATE{n} [시간 ms]

{n}의 executeUpdate 메소드가 수행됨

[cpu] SQL-EXECUTE{n} [시간ms]

{n}의 execute 메소드가 수행됨

[cpu] SQL-EXECUTE-QUERY [시간ms]

executeQuery(SQL) 메소드가 수행됨

[cpu] SQL-EXECUTE-UPDATE [시간ms]

executeUpdate(SQL) 메소드가 수행됨

[cpu] SQL-EXECUTE [시간ms]

(Prepared/Callable)Statement.execute(SQL) 혹은 excuteBatch가호출됨

X-View 데이터 전송

제니퍼 서버는 server_udp_runtime_port 옵션으로 설정한 포트로 제니퍼 에이전트가 보내는 트랜잭션 데이터를 수집하고, server_udp_lwst_call_stack_port 옵션으로 설정한 포트로 프로파일 데이터를 수집한다.

프로파일 데이터 크기는 프로파일 설정에 영향을 받는다. 그런데 UDP 방식으로 전송할 수 있는 데이터 크기가 64 KB를 넘을 수 없기 때문에 제니퍼 에이전트는 64 KB 보다 큰 프로파일 데이터에 대해서는 여러 개의 패킷으로 분리해서 전송한다. 패킷 크기는 제니퍼 에이전트의 xview_profile_udp_packet_size 옵션으로 설정하는데 기본 값은 32757이고 단위는 바이트이다.

xview_profile_udp_packet_size = 32757

만약 데이터 크기가 제니퍼 에이전트의 xview_profile_udp_packet_size 옵션으로 지정한 크기를 초과하면 제니퍼 에이전트는 해당 데이터를 분할해서 제니퍼 서버에 전송한다. 따라서 xview_profile_udp_packet_size 옵션을 작게 설정하면 제니퍼 에이전트가 제니퍼 서버에 전송하는 패킷 개수가 많아지기 때문에 제니퍼 서버 성능 향상을 위해서 xview_profile_udp_packet_size 옵션을 가능한 크게 설정하는 것을 권장한다. 그리고 프로파일 데이터에 프로토콜 해더가 별도로 추가되므로 xview_profile_udp_packet_size 옵션은 최대 60000까지만 지정하도록 한다.

제니퍼 서버는 제니퍼 에이전트가 패킷으로 분리해서 전송한 프로파일 데이터를 임시 큐에 저장한 후에 모든 패킷이 도착하면 이를 결합한다. 임시 큐 크기는 제니퍼 서버의 xview_profile_multi_packet_queue_size 옵션을 통해서 설정한다. 기본 값은 303이다.

xview_profile_multi_packet_queue_size = 303

제니퍼 서버는 임계치를 초과해도 모든 패킷이 도착하지 않으면 임시 큐에 저장된 패킷만으로 프로파일 데이터를 구성하고 TIME OUT을 발생시킨다. TIME OUT이 일어나면 프로파일 데이터의 일부분이 유실되게 된다. 제니퍼 서버의 xview_profile_multi_packet_time_out 옵션을 통해서 임계치를 설정한다. 기본 값은 1000이고 단위는 밀리 세컨드이다.

xview_profile_multi_packet_time_out = 1000

제니퍼 에이전트는 트랜잭션의 응답 시간이 임계치 미만이면 해당 트랜잭션에 대한 프로파일 데이터를 제니퍼 서버에 전송하지 않는다. 제니퍼 에이전트의 xview_profile_ignore_resp_time 옵션으로 임계치를 설정한다. 기본 값은 0이고 단위는 밀리 세컨드이다.

xview_profile_ignore_resp_time = 0

xview_profile_ignore_resp_time 옵션은 제니퍼 에이전트와 제니퍼 서버에서 모두 사용 할 수 있다. 에이전트에서는 서버로 전송할 기준 시간을 설정하기 위해 사용하고, 서버에서는 저장을 위한 기준 시간을 설정하기 위해 사용한다.

네크워크 설정과 관련한 자세한 사항은 네트워크 설정과 제니퍼서버 네트워크 구성을 참조한다.

UDP로 전송할 수 있는 데이터 크기(UDP Send Buffer Size)는 64 KB가 최대 값인데 선마이크로시스템즈 솔라리스와 HP HP-UX 운영 체계는 64 KB가 기본 값이지만 IBM AIX 운영 체계는 64 KB보다 작은 수치가 기본 값이다. 제니퍼 에이전트가 UDP로 전송하는 데이터 크기가 UDP로 전송할 수 있는 데이터 크기보다 크면 데이터는 전송되지 않고 유실된다. 만약 운영 체계에 설정된 UDP 전송 데이터 크기를 넘는 경우에는 에러 메시지가 로그 파일에 기록되지만 제니퍼 에이전트와 제니퍼 서버 사이에 존재하는 네트워크 장비 버퍼 사이즈를 초과하는 경우에는 에러 메시지 기록 없이 패킷이 유실된다.

대용량 프로파일 데이터를 안정적으로 수집하기

용량이 큰 프로파일 데이터를 여러 개의 패킷으로 분리해서 전송해도 UDP 특성으로 인한 손실은 불가피하다. 프로파일 데이터 크기가 작아도 UDP 특성으로 인한 손실은 발생할 수 있다.

그래서 제니퍼는 프로파일 데이터 크기나 트랜잭션 응답 시간을 기준으로 UDP 전송 손실을 방지할 수 있는 방법을 제공한다. 기준에 부합하는 프로파일 데이터를 제니퍼 서버로 전송하지 않고 제니퍼 에이전트를 설치한 하드웨어에 저장한 후에 요청 시 역방향 호출로 프로파일 데이터를 가져온다.

이 기능을 사용하려면 AgentDB를 사용해야 한다.

제니퍼 에이전트의 agent_db_enabled 옵션으로 AgentDB 사용 여부를 설정한다. 이 옵션을 true로 설정한다.

agent_db_enabled = true

AgentDB는 데이터를 비동기 방식으로 저장하는데, 제니퍼 에이전트의 agent_db_max_queue 옵션으로 저장 대기 큐 크기를 설정한다. 저장 대기 큐가 꽉 찬 경우에는 프로파일 데이터를 AgentDB에 저장하지 않고, 이전과 동일하게 제니퍼 서버에 전송한다. 그러나 기본 값이 10인 저장 대기 큐가 꽉 차는 경우는 많지 않고, 큐 크기를 크게하는 경우에 메모리 사용량이 증가할 수 있기 때문에 이 옵션을 수정하지 않는 것을 권장한다.

agent_db_max_queue = 10

제니퍼 에이전트의 agent_db_rootpath 옵션으로 AgentDB가 사용하는 디렉토리 위치를 설정한다. 기본 값은 현재 디렉토리이다.

agent_db_rootpath = .

제니퍼 에이전트는 agent_db_rootpath 옵션으로 설정한 위치에 .db라는 디렉토리를 만들고 일자별로 하위 디렉토리를 만들어서 데이터를 저장한다. 이 옵션으로 설정한 디렉토리를 자동으로 생성하지 않기 때문에 임의의 디렉토리를 지정한 경우에는 해당 디렉토리가 존재해야 한다. 그리고 쓰기 권한도 있어야 한다. 여러 제니퍼 에이전트가 AgentDB 저장 디렉토리로 동일한 디렉토리를 사용해서는 안된다. 일시적으로 제니퍼 에이전트 아이디가 동일하면 파일이 훼손될 수 있다. 그리고 이 값을 변경하려면 제니퍼 에이전트를 설치한 자바 애플리케이션을 재시작해야 한다. 디렉토리를 변경한 경우에 이전 파일을 변경한 디렉토리로 단순하게 복사하면 과거 데이터를 계속 사용할 수 있다. 단, 자바 애플리케이션을 정지한 후에 복사를 해야 한다.

제니퍼 에이전트의 xview_profile_dump_entry 옵션으로 AgentDB에 저장할 프로파일 데이터 크기를 설정한다. 이 옵션으로 지정한 값보다 크기가 큰 프로파일 데이터를 AgentDB에 저장한다. 기본 값은 Integer 최대 값이고 단위는 바이트이다.

xview_profile_dump_entry = 10240000

제니퍼 에이전트의 xview_profile_dump_elapsed 옵션으로 AgentDB에 저장할 프로파일 데이터의 트랜잭션 응답 시간을 설정한다. 기본 값은 Integer 최대 값이고 단위는 밀리 세컨드이다.

xview_profile_dump_elapsed = 300000

예를 들어, CPU를 많이 사용한 트랜잭션이 5분 이상 Hang 상태에 있고, 액티브 서비스 상세 화면에서 액티브 프로파일 데이터 크기가 큰 것을 확인하였다. 문제를 해결하기 위해서는 해당 트랜잭션에 대한 프로파일 데이터를 수집해야 하는데, UDP 전송에 의존하면 데이터가 유실될 수 있다. 이런 경우에 xview_profile_dump_elapsed 옵션을 300000으로 설정하면 해당 트랜잭션 프로파일 데이터가 AgentDB에 저장되기 때문에 안정적으로 확인할 수 있다.

xview_profile_dump_elapsed과 xview_profile_dump_entry 옵션은 OR 조건이다.

제니퍼 에이전트의 log_xview_profile_dump 옵션은 프로파일 데이터가 AgentDB에 저장되고 있는지를 확인하기 위한 디버그 옵션이다. 기본 값은 false이다.

log_xview_profile_dump = true

프로파일 데이터 항목 개수는 profile_buffer_size 옵션으로 설정한 개수를 초과할 수 없다. 따라서 항목이 많은 프로파일 데이터를 수집하려면 이 옵션을 충분하게 큰 값으로 설정해야 한다. 자세한 사항은 [프로파일링 제어]를 참조한다.

X-View 데이터 저장

제니퍼 서버는 X-View 데이터를 파일에 저장한다. 제니퍼 서버의 data_directory 옵션으로 X-View 데이터가 저장되는 디렉토리를 설정한다.

data_directory = ../../data/file/

데이터 파일 손실을 방지하기 위해서 이 옵션을 수정하려면 제니퍼 서버를 정지한 후에 설정 파일에서 직접 수정해야 한다.

트랜잭션 데이터

제니퍼 서버는 최근에 수집한 트랜잭션 데이터를 메모리 큐에 담아놓고, 제니퍼 클라이언트는 2초 주기로 트랜잭션 데이터를 이 메모리 큐에서 읽어간다. 따라서 이 메모리 큐 크기는 최대 서비스 요청률의 2배 정도로 설정해야 한다. 제니퍼 서버의 xview_server_queue_size 옵션으로 이 큐 크기를 설정하는데 기본 값은 512이다. 이 옵션을 변경하면 제니퍼 서버를 재시작하여야 한다.

xview_server_queue_size = 512

제니퍼 서버의 xview_point_ignore_resp_time 옵션으로 설정한 값보다 응답 시간이 작은 트랜잭션 데이터는 큐에 담지 않고 저장도 하지 않는다. 기본 값은 0이고 단위는 밀리 세컨드이다.

xview_point_ignore_resp_time = 0

프로파일 데이터

제니퍼 서버는 제니퍼 에이전트로부터 수집한 프로파일 데이터를 임시적으로 메모리 큐에 담아 놓은 후에 0.5초를 주기로 파일에 저장한다. 이 메모리 큐 크기는 제니퍼 서버의 xview_profile_cache_queue_size 옵션으로 설정하는데 프로파일 데이터가 파일에 저장되기 전에 이 큐가 전부 차면 프로파일 데이터의 유실이 발생할 수 있다. 따라서 저장 주기가 0.5초이기 때문에 최대 서비스 요청률의 50% 정도로 xview_profile_cache_queue_size 옵션을 설정해야 한다. 기본 값은 512이다. 이 옵션을 변경하면 제니퍼 서버를 재시작하여야 한다.

xview_profile_cache_queue_size = 512

제니퍼 서버는 프로파일 데이터를 실시간 X-View 프로파일 파일과 일자별 X-View 프로파일 파일에 이중으로 저장한다. 실시간 X-View 프로파일 파일에는 최근 수행된 트랜잭션에 대한 프로파일 데이터가 순환적으로 저장되는데, 그 기간은 실시간 X-View 프로파일 파일 크기와 서비스 요청률에 영향을 받는다. 일자별 X-View 프로파일 파일은 과거 프로파일 데이터 조회 목적을 위한 것이다.

실시간 X-View 프로파일 파일 크기는 제니퍼 서버의 xview_profile_isam_file_max_size 옵션으로 설정한다. 기본 값은 512mb이다. 이 옵션을 변경하면 제니퍼 서버를 재시작하여야 한다.

xview_profile_isam_file_max_size = 10mb
xview_profile_isam_file_max_size = 512mb
xview_profile_isam_file_max_size = 1gb

이 옵션은 mb(메가 바이트) 혹은 gb(기가 파이트) 등의 단위와 함께 설정한다. 제니퍼 서버를 처음 실행할 때 이 옵션으로 설정한 크기의 파일이 만들어진다.

제니퍼 서버의 xview_profile_ignore_resp_time 옵션으로 설정한 값보다 응답 시간이 작은 프로파일 데이터는 실시간 X-View 프로파일 파일에 저장되지 않는다. 기본 값은 0이고 단위는 밀리 세컨드이다.

xview_profile_ignore_resp_time = 100

이 옵션을 제니퍼 서버에 설정하는 것보다 제니퍼 에이전트에 설정하는 것이 효율적이다. 제니퍼 에이전트에 설정하면 프로파일 데이터가 네트워크로 전송도 되지 않기 때문이다. 실시간 X-View 프로파일 파일에는 프로파일 데이터를 저장하지만, 조건에 따라서 일자별 X-View 프로파일 파일에는 프로파일 데이터를 저장하지 않도록 설정할 수 있다. 첫번째로 제니퍼 서버의 xvdaily_ignore_resp_time 옵션으로 설정한 값보다 응답 시간이 작은 프로파일 데이터는 일자별 X-View 프로파일 파일에 저장되지 않는다. 기본 값은 500이고 단위는 밀리 세컨드이다.

xvdaily_ignore_resp_time = 500

두번째로 제니퍼 에이전트 별로 프로파일 데이터 저장 여부를 설정할 수 있다. 예를 들어, 클러스터링으로 구성된 동일한 애플리케이션들을 모니터링할 때 대표 제니퍼 에이전트에 대해서만 프로파일 데이터를 저장하면 파일 공간을 효율적으로 사용할 수 있다. 이는 제니퍼 서버의 xvdaily_agents 옵션으로 설정한다.

xvdaily_agents = W11,W12

값을 설정하지 않으면 모든 제니퍼 에이전트에 대한 프로파일 데이터를 일자별 X-View 프로파일 파일에 저장한다.

X-View 차트와 트랜잭션 리스트

X-View 차트

사용자는 X-View 데이터를 X-View 차트를 통해서 확인할 수 있다. X-View 차트는 [대시보드 | 제니퍼 대시보드] 메뉴, [실시간 모니터링| X-View] 메뉴, [통계 분석 | X-View] 메뉴등에 존재한다.

[통계 분석 | X-View] 메뉴에서 트랜잭션 처리 현황을 검색할 때 최근에 수행된 트랜잭션 데이터도 검색할 수 있지만 10분이 경과하지 않은 최근에 처리된 트랜잭션에 대해서는 프로파일 데이터가 나타나지 않을 수 있다. 왜냐하면 10분 주기로 프로파일 인덱스를 생성하는데 아직 인덱스가 만들어지지 않은 트랜잭션의 프로파일 데이터는 검색할 수 없기 때문이다.

X-View 차트

[실시간 모니터링| X-View] 메뉴와 [통계 분석 | X-View] 메뉴를 이동하지 않고, 상단에 있는 실시간 모니터링 체크박스를 통해서 실시간 X-View 데이터 조회와 일자별 X-View 데이터 조회를 선택할 수 있다.

Y 축

X-View 차트 Y 축은 기본적으로 트랜잭션의 수행 시간을 의미하지만, X-View 유형에 따라서 기준을 다르게 설정할 수 있다. 예를 들어, 트랜잭션 유형에서 SQL 시간이나 Fetch 시간 등으로 그 기준을 변경할 수 있다.

Y 축 전체 구간의 크기는 0초에서 9초까지로 설정되어 있는데 사용자가 전체 구간의 크기를 임의로 변경할 수 있다. 단위는 밀리 세컨드이다.

Shift 키와 함께 누르면 증감하는 크기가 10배가 된다.

아래쪽 방향키를 사용하는 경우에도 Y 축 최대 값이 100 밀리 세컨드보다 작을 수는 없다.

X-View 차트 Y 축 전체 구간 크기 설정

슬라이더를 사용하거나 임의의 값을 설정하여 Y 축 전체 구간 크기를 설정할 수 있다. Y 축 상단에 있는 아이콘을 클릭하면 임의의 값을 입력할 수 있는 필드가 나타난다. 수행 시간이 Y 축 최대 값을 초과하는 모든 트랜잭션은 X-View 차트 상단에 표시된다. 정확한 시간을 파악하려면 위쪽 방향키를 통해서 Y 축 전체 구간 크기를 증가시켜야 한다.

X 축

X-View 차트 X 축은 트랜잭션이 수행된 시간을 의미한다. [통계 분석 | X-View] 메뉴에서는 사용자가 시간 구간을 지정하여 검색하기 때문에 X 축 구간은 고정된다.

[통계 분석 | X-View] 메뉴에서 트랜잭션 처리 현황을 검색할 때 시간 구간을 1시간 이하로 지정하는 것을 권장한다. 서비스 처리율이 높은 자바 애플리케이션을 모니터링하는 경우에는 트랜잭션 데이터가 많아서 검색 처리 시간이 길어지고 자바 플러그인 힙 메모리가 부족할 수 있다.

[대시보드 | 제니퍼 대시보드] 메뉴와 [실시간 모니터링 | X-View] 메뉴에서는 X 축 구간은 기본적으로 10분으로 설정되어 있는데 사용자가 구간의 크기를 임으로 변경할 수 있다

X-View 차트 X 축 전체 구간 크기 설정

슬라이더를 사용하여 X축 전체 구간 크기를 설정할 수 있다.

X-View 차트에 트랜잭션을 표시할 때 X 축 위치는 제니퍼 서버가 트랜잭션 정보를 수집한 시간을 기준으로 결정된다. 제니퍼 서버가 2개 이상의 자바 애플리케이션을 모니터링 할 수 있는데 각각의 자바 애플리케이션의 시스템 시간이 다를 수 있기 때문에 X-View 차트에 트랜잭션을 표시할 때 X 축 위치로 제니퍼 서버의 시간을 사용하는 것이다.

이전 버전에서는 마이너스 키와 플러스 키를 이용해서 X 축 구간 크기는 고정한 상태에서 구간대만을 변경할 수 있었다. 그러나 지금은 마이너스 키와 플러스 키는 왼쪽 방향키와 오른쪽 방향키와 동일하게 동작한다. 대신 X-View 차트 구간 선택 기능을 통해서 특정 구간에 대한 분석을 수행할 수 있다.

X-View 차트 구간 선택 기능을 사용하는 방법은 다음과 같다.

X-View 차트 유형

X-View 차트 유형은 트랜잭션을 표시하는 방식을 의미한다. 예를 들어, 트랜잭션 유형은 개별 트랜잭션을 X-View 차트에 모두 표시하는 방식이고, 사용자 유형은 트랜잭션을 클라이언트 아이디로 묶어서 X-View 차트에 표시하는 방식이다. [실시간 모니터링 | X-View] 메뉴와 [통계 분석 | X-View] 메뉴에서는 X-View 유형을 선택할 수 있다.

[대시보드 | 제니퍼 대시보드] 메뉴에서는 X-View 유형이 트랜잭션으로 고정되어 있다.

트랜잭션

트랜잭션 유형은 X-View 차트에 X 축 구간에 해당하는 트랜잭션을 X 형태의 점으로 표시한다.

트랜잭션 유형 X-Vew 차트

정상적인 트랜잭션은 푸른색 계열 색으로 표시되고 예외가 발생한 트랜잭션은 붉은색 계열 색으로 표시된다.

검색 조건이나 컨텍스트 메뉴를 통해서 다양한 설정을 할 수 있다. 컨텍스트 메뉴는 X-View 차트에서 오른쪽 마우스를 클릭하면 나타난다.

트랜잭션 유형 X-View 차트(Mixed)

사용자

사용자 유형은 X-View 차트에 X 축 구간에 해당하는 트랜잭션을 동일한 클라이언트 아이디를 중심으로 묶어서 작은 원으로 표시한다. 원 색상은 아무런 의미가 없고 원 옆에 트랜잭션 숫자가 함께 표시된다.

사용자 유형 X-Vew 차트

검색 조건이나 컨텍스트 메뉴를 통해서 다양한 설정을 할 수 있다. 컨텍스트 메뉴는 X-View 차트에서 오른쪽 마우스를 클릭하면 나타난다. 예외만 표시 - 예외가 발생한 트랜잭션만을 표시한다.

애플리케이션

애플리케이션 유형은 X-View 차트에 X 축 구간에 해당하는 트랜잭션을 동일한 애플리케이션을 중심으로 묶어서 작은 원으로 표시한다. 원 색상은 아무런 의미가 없고 원 옆에 트랜잭션 숫자가 함께 표시된다.

애플리케이션 유형 X-Vew 차트

검색 조건이나 컨텍스트 메뉴를 통해서 다양한 설정을 할 수 있다. 컨텍스트 메뉴는 X-View 차트에서 오른쪽 마우스를 클릭하면 나타난다.

GUID

GUID 유형 X-Vew 차트

GUID 응답 시간은 해당 GUID에 해당하는 모든 트랜잭션 중에서 마지막 종료 시간에서 최초 호출 시간을 뺀 값을 의미한다. Y 축을 GUID 응답 시간을 기준으로 표시한다.

애플리케이션과 클라이언트 IP 등을 이용한 필터링

X-View 차트에 표시된 트랜잭션을 애플리케이션과 클라이언트 IP 등을 이용해서 필터링할 수 있다.

애플리케이션은 정규 표현식을 이용해서 필터링할 수 있고, 클라이언트 IP에는 와일드 카드(*)를 사용할 수 있다.

192.168.0.1
192.*.0.1
192.*.*.*

또한 사용자 아이디와 GUID를 이용해서도 필터링을 할 수 있다. GUID도 정규 표현식을 이용해서 필터링할 수 있다.

필터링은 애플리케이션과 클라이언트 IP 필드에 조건을 입력한 후에 엔터 키를 누르면 수행된다. 단, [통계 분석 | X-View] 메뉴에서 [검색] 버튼을 클릭하면 데이터를 가져올 뿐 필터링은 수행되지 않는다. 이 메뉴에서도 필터링을 수행하려면 애플리케이션과 클라이언트 IP 필드에 검색 조건을 입력한 후에 엔터 키를 눌러야 한다.

트랜잭션 리스트

트랜잭션 데이터 상세 내용은 X-View 차트에서 임의의 점을 선택했을 때 확인할 수 있다. 다음 그림에서 팝업 창이 트랜잭션 리스트이다.

트랜잭션 리스트

트랜잭션 리스트 항목에 대한 설명은 [트랜잭션 데이터]를 참조한다.

X-View 차트 유형이 트랜잭션인 경우에는 리스트가 하나로만 표시된다. 나머지 유형의 경우에는 2개의 리스트가 표시된다. 첫번째 리스트에는 해당 유형에 따른 데이터가 표시되고 두번째 리스트에는 첫번째 리스트에서 선택한 항목에 포함되어 있는 트랜잭션 목록이 표시된다.

항상 트랜잭션 데이터 세부 항목이 의미가 있는 것은 아니다. 예를 들어, 제니퍼 에이전트를 설치한 대상이 자바 애플리케이션 서버가 아닌 경우에는 클라이언트 IP나 클라이언트 아이디가 0으로 표시된다. 이런 제약 조건이 존재하는 항목은 다음과 같다.

트랜잭션 데이터 항목별 제약

항목

수집 조건

GUID

GUID 설정을 한 경우에만 표시

클라이언트 IP

모니터링 대상이 자바 애플리케이션 서버인 경우

클라이언트 아이디

모니터링 대상이 자바 애플리케이션 서버인 경우

사용자 아이디

모니터링 대상이 자바 애플리케이션 서버이고 사용자 아이디 추적 설정을 한 경우

CPU 시간

Native 모듈(jennifer20.so)을 올바르게 설치한 경우

SQL 시간

JDBC 자원 추적을 설정한 경우

Fetch 시간

JDBC 자원 추적을 설정한 경우

TX 시간

외부 트랜잭션 추적을 설정한 경우

클라이언트 응답 시간

모니터링 대상이 자바 애플리케이션 서버이고 클라이언트 응답 시간 추적 설정을 한 경우

트랜잭션 리스트 오른쪽 상단에 있는 [+] 아이콘을 통해서 트랜잭션 리스트 목록을 CSV 형식 파일이나 프로파일 데이터를 포함한 텍스트 파일로 Export할 수 있다.

트랜잭션 리스트 Export

상단에 있는 애플리케이션 필터를 체크하면 트랜잭션 리스트에서 선택한 트랜잭션과 동일한 애플리케이션에 해당하는 트랜잭션들만이 X-View 차트에 표시된다.

프로파일 탭 영역

트랜잭션 리스트에서 특정 트랜잭션 데이터를 선택하면 하단 프로파일 탭 영역에 해당 트랜잭션에 대한 프로파일 데이터가 표시된다.

프로파일 탭 영역

해당 트랜잭션에 대한 프로파일 데이터가 없을 때는 텍스트 탭만이 활성화되고 다른 탭은 선택할 수 없게 된다.

텍스트

텍스트 탭에는 트랜잭션 리스트에서 선택한 트랜잭션에 대한 트랜잭션 데이터와 모든 프로파일 항목이 텍스트 형식으로 표시된다. 프로파일 항목 응답 시간에 따라서 텍스트 색상이 다르게 표현된다. 단위는 밀리 세컨드이다.

좌우 스크롤이 텍스트 탭에 나타나지 않게 하려면 상단에 있는 [자동 줄바꿈]을 선택한다.

텍스트 탭

텍스트 탭에서 프로파일 데이터는 START로 시작하여 END로 끝나는 형태로 표시된다. START와 END는 시작과 종료를 표현하기 위해 임의로 추가한 안내 문자열이다.

텍스트 탭에서 오른쪽 마우스를 클릭하면 나타나는 컨텍스트 메뉴에서 [프로파일을 게시판에 저장] 메뉴를 클릭하면 해당 프로파일 데이터가 게시판에 저장된다.

프로파일

프로파일 탭에는 트랜잭션 리스트에서 선택한 트랜잭션에 대한 모든 프로파일 항목이 트리 형태로 표시된다. 다음은 프로파일 리스트 칼럼에 대한 설명이다.

프로파일 리스트 칼럼

칼럼

설명

이름

프로파일 항목 이름으로 메소드 이름이나 메시지 유형 이름이 표시된다.

NO

프로파일 항목 고유 번호

실행 시간

해당 프로파일 항목이 시작된 시간으로 제니퍼 에이전트를 설치한 자바 애플리케이션 시간을 기준으로 한다.

Gap 시간

해당 프로파일 항목과 바로 이전의 프로파일 항목 시작 시간의 차이

응답 시간

해당 프로파일 항목 수행에 소요된 시간

내용

관련 내용

프로파일 탭

Gap 시간은 트랜잭션을 수행하는 과정에서 프로파일하지 않은 영역을 분석하는데 도움을 준다. 예를 들어, Gap 시간이 큰 프로파일 항목이 있다면 바로 전 프로파일 항목과 해당 프로파일 항목 사이에서 처리된 작업에 오랜 시간이 소요되었음을 의미한다. 따라서 그 사이에서 이루어진 작업을 프로파일링하도록 설정하면 상세한 내용을 분석할 수 있다.

이름이 [SQL-EXECUTE]로 시작하는 프로파일 항목을 선택한 후에 오른쪽 마우스를 클릭하면 SQL를 빌드하거나 복사할 수 있다. 자세한 내용은 [SQL(227 페이지)]을 참조한다. 그리고 프로파일 리스트 오른쪽 상단에 있는 [+] 아이콘을 통해서 전체 트리를 열고 닫을 수 있다.

프로파일 리스트 열고 닫기

프로파일 리스트에서 응답 시간이 큰 항목의 이름 칼럼을 선택한 후에 오른쪽 마우스를 클릭하면 나타나는 컨텍스트 메뉴에서 [Critical Path] 메뉴를 선택하면 해당 프로파일 항목의 하위 프로파일 항목 중에서 응답 시간이 가장 큰 항목을 쉽게 찾을 수 있다.

SQL

SQL 탭에는 트랜잭션 리스트에서 선택한 트랜잭션에 대한 SQL 메시지 유형 프로파일 항목이 표시된다. 이를 통해서 트랜잭션이 수행한 SQL 목록을 파악할 수 있다.

다음은 SQL 리스트 칼럼에 대한 설명이다.

SQL 리스트 칼럼

칼럼

설명

NO

프로파일 항목 고유 번호로 텍스트 탭이나 프로파일 탭에서 해당 프로파일 항목 위치를 찾는데 도움을 준다.

실행 시간

해당 프로파일 항목이 시작된 시간으로 제니퍼 에이전트를 설치한 자바 애플리케이션 시간을 기준으로 한다.

Gap 시간

해당 프로파일 항목과 바로 이전 프로파일 항목 시작 시간의 차이

응답 시간

해당 프로파일 항목 수행에 소요된 시간

SQL

SQL 쿼리

파라미터 1

SQL 쿼리 중복을 방지하기 위해서 SQL 쿼리 중에서 분리해낸 상수 파라미터

파라미터 2

SQL 쿼리에 대한 바인딩 파라미터

SQL 탭

SQL 리스트 오른쪽 상단에 있는 [+] 아이콘을 통해서 전체 SQL를 열고 닫을 수 있다.

SQL 리스트 열고 닫기

특정 SQL에 대한 실행 계획을 확인하는 방법은 다음과 같다.

SQL 실행 계획 팝업 창에 대한 상세한 정보는 SQL 실행계획을 참조한다.

또한 특정 SQL를 클릭보드에 복사하는 방법은 다음과 같다.

파일

파일 탭에는 트랜잭션 리스트에서 선택한 트랜잭션에 대한 파일 메시지 유형 프로파일 항목이 표시된다. 이를 통해서 트랜잭션이 수행한 파일 IO 목록을 파악할 수 있다. 다음은 파일 리스트 칼럼에 대한 설명이다.

파일 리스트 칼럼

칼럼

설명

NO

프로파일 항목 고유 번호로 텍스트 탭이나 프로파일 탭에서 해당 프로파일 항목 위치를 찾는데 도움을 준다.

실행 시간

해당 프로파일 항목이 시작된 시간으로 제니퍼 에이전트를 설치한 자바 애플리케이션 시간을 기준으로 한다.

Gap 시간

해당 프로파일 항목과 바로 이전 프로파일 항목 시작 시간의 차이

응답 시간

해당 프로파일 항목 수행에 소요된 시간

모드

[WOPEN]은 쓰기 모드를, [ROPEN]은 읽기 모드를 의미한다.

파일

파일 IO 대상이 된 파일의 경로와 이름이다.

파일 탭

소켓

소켓 탭에는 트랜잭션 리스트에서 선택한 트랜잭션에 대한 소켓 메시지 유형 프로파일 항목이 표시된다. 이를 통해서 트랜잭션이 수행한 소켓 IO 목록을 파악할 수 있다. 다음은 소켓 리스트 칼럼에 대한 설명이다.

소켓 리스트 칼럼

칼럼

설명

NO

프로파일 항목 고유 번호로 텍스트 탭이나 프로파일 탭에서 해당 프로파일 항목 위치를 찾는데 도움을 준다.

실행 시간

해당 프로파일 항목이 시작된 시간으로 제니퍼 에이전트를 설치한 자바 애플리케이션 시간을 기준으로 한다.

Gap 시간

해당 프로파일 항목과 바로 이전 프로파일 항목 시작 시간의 차이

응답 시간

해당 프로파일 항목 수행에 소요된 시간

모드

[Output]은 쓰기 모드이고, [Input]은 읽기 모드를 의미한다.

IP

소켓 IO 대상이 되는 애플리케이션 IP 주소이다.

포트

소켓 IO 대상이 되는 애플리케이션 포트 번호이다.

로컬 포크

소켓 IO 대상이 되는 애플리케이션과 통신하는데 사용한 로컬 포트 번호이다.

소켓 탭

메시지

메시지 탭에는 트랜잭션 리스트에서 선택한 트랜잭션에 대한 메시지 유형 프로파일 항목이 표시된다.

SQL, 파일, 소켓 등의 프로파일 항목도 메시지 유형에 해당하지만 메시지 탭에는 나타나지 않는다.

다음은 메시지 리스트 칼럼에 대한 설명이다.

메시지 탭

특정 메시지에 대한 상세 정보를 확인하는 방법은 다음과 같다.

차트

차트 탭

성능 데이터 항목

항목

설명

호출 건수

호출 건수를 기준으로 차트를 표시한다.

실패 건수

실패 건수를 기준으로 차트를 표시한다.

응답 시간의 합

응답 시간의 합을 기준으로 차트를 표시한다.

평균 응답 시간

평균 응답 시간을 기준으로 차트를 표시한다.

최소 응답

최소 응답 시간을 기준으로 차트를 표시한다.

최대 응답

최대 응답 시간을 기준으로 차트를 표시한다.

CPU 시간

CPU 시간을 기준으로 차트를 표시한다.

CPU(tpmC)

CPU(tpmC)를 기준으로 차트를 표시한다.

X-View를 이용한 문제 해결

X-View에서 비정상적인 패턴이 발견되면 해당 트랜잭션을 선별적으로 분석할 수 있다는 것이 제니퍼의 강점이다. 관련 트랜잭션들에 대한 성능 데이터를 비교함으로써 문제가 어디서 발생했는지를 쉽게 판별할 수 있다.

트랜잭션 데이터를 분석할 때 다음 사항을 참고하도록 한다.

  1. 문제가 있는 트랜잭션들의 제니퍼 에이전트가 동일하다면 자바 애플리케이션 내부의 문제일 가능성이 높고, 서로 다르다면 자바 애플리케이션 외부 문제일 가능성이 높다.

  2. 문제가 있는 트랜잭션들의 애플리케이션 이름이 동일하면 특정 업무 문제일 가능성이 높다.

  3. 문제가 있는 트랜잭션들의 응답 시간에서 SQL 혹은 Fetch 시간이 차지하는 비중이 크면 데이터베이스 문제일 가능성이 높고, TX 시간이 차지하는 비중이 크면 데이터베이스를 제외하면 외부 시스템 문제일 가능성이 높다.

  4. JDBC 연결에 문제가 발생하면 SQL 혹은 Fetch 시간은 크지 않을 수 있다. JDBC 연결 문제는 데이터베이스나 자바 애플리케이션 서버 내부 문제에 기인할 수 있는데 이것은 문제가 있는 트랜잭션들의 제니퍼 에이전트가 동일한지 다른지로 구분할 수 있다.

  5. 문제가 있는 트랜잭션들의 CPU 시간이 크다면 로직적 부하(문자열 제어, 루핑 로직 등)가 존재할 가능성이 높다.

  6. 애플리케이션 이름이 동일한 JSP를 실행한 경우에 특정 트랜잭션만이 응답 시간이 큰 경우가 있다. 이 경우에 응답 시간에서 CPU 시간이 차지하는 비중이 큰 경우에는 JSP 컴파일로 발생했을 가능성이 있다. 이 경우에는 프로파일 데이터에서 FILE OPEN 메시지를 확인할 수 있을 것이다.

프로파일 관련 설정이 정확하지 않으면 일부 정보가 사실과 다를 수 있기 때문에 정확성 여부를 확인해야 한다. 예를 들어, 운영 체계와 맞지 않는 Native 모듈(jennifer20.so/dll 파일)을 사용하면 기형적인 CPU 시간이 표시될 수 있다.

자바 메소드 프로파일링

제니퍼는 프로파일링을 연계 프로파일링과 메소드 프로파일링으로 구분한다. DB 혹은 외부 트랜잭션 추적을 연계 프로파일링이라고 하고, 메소드 호출 응답 시간과 파라미터 혹은 반환 값 등의 추적을 메소드 프로파일링이라 한다.

메소드 프로파일링은 연계 프로파일링에 비해서 우선 순위가 낮다. 따라서 연계 프로파일 설정이 메소드 프로파일 설정에 우선한다. 예를 들어, A 클래스가 연계 프로파일과 메소드 프로파일에 모두 설정되어 있다면 메소드 프로파일링은 이루어지지 않고, 연계 프로파일링만이 이루어진다.

메소드 프로파일링은 다음과 같은 과정으로 이루어진다.

메소드 프로파일링 과정

메소드 프로파일 범위 설정

제니퍼 에이전트의 profile로 시작하는 옵션들로 메소드 프로파일 범위를 설정한다. 수정한 옵션을 반영하려면 제니퍼 에이전트를 설치한 자바 애플리케이션을 재시작해야 한다.

java, org.jsn, org.apache.jennifer. com.javaservice 패키지는 프로파일링할 수 없다. 단, javax 패키지는 프로파일링할 수 있다.

example.BusinessManager 클래스의 모든 메소드를 프로파일링하려면 다음과 같이 설정한다.

profile_class = example.BusinessManager

추가로 example.DomainManager 클래스의 모든 메소드를 프로파일링하려면 세미콜론[;]을 구분자로 해서 profile_class 옵션에 설정한다. profile_class 옵션뿐만 아니라 메소드 프로파일 범위 설정과 관련한 모든 옵션에 2개 이상을 설정하려면 세미콜론[;]을 구분자로 사용한다.

profile_class = example.BusinessManager;example.DomainManager

메소드 프로파일 단위는 특정 클래스의 특정 메소드이다. 즉, 앞에서와 같이 클래스만 설정하면 example.BusinessManager 클래스의 모든 메소드가 메소드 프로파일 범위에 포함된다. 따라서 특정 메소드만을 메소드 프로파일 범위에 포함시키려면 제니퍼 에이전트의 profile_target_method 옵션으로 해당 메소드를 설정한다.

profile_target_method = execute

그런데 메소드 프로파일 범위로 설정한 클래스들 중에서 이름이 동일한 메소드가 있고, 이중 특정 클래스의 특정 메소드만을 메소드 프로파일 범위에 포함시키려면 다음과 같이 구체적으로 설정한다.

profile_target_method = example.BusinessManager.execute

반대로 특정 메소드만을 메소드 프로파일 범위에서 제외하려면 제니퍼 에이전트의 profile_ignore_method 옵션으로 설정한다.

profile_ignore_method = example.BusinessManager.someMethod

메소드의 접근자를 통해서도 메소드 프로파일 범위를 설정할 수 있다. 예를 들어, public 접근자와 접근자가 없는 메소드를 메소드 프로파일 범위에 포함시키려면 다음과 같이 설정한다.

profile_access_method = public;none

profile_access_method 옵션에 설정이 가능한 값은 다음과 같다.

그리고 특정 클래스를 상속한 모든 클래스를 메소드 프로파일 범위에 포함시키려면 제니퍼 에이전트의 profile_client_super 옵션을 사용한다. 예를 들어, example.ejb.BaseSessionBean을 상속한 모든 클래스를 메소드 프로파일 범위에 포함시키려면 다음과 같이 설정한다.

profile_super = example.ejb.BaseSessionBean

그러나 이 경우에 직접적으로 상속받은 클래스만이 메소드 프로파일 범위에 포함된다. A 클래스가 example.ejb.BaseSessionBean 클래스를 상속하고 B 클래스가 A 클래스를 상속했다면, A 클래스는 메소드 프로파일 범위에 포함되지만 B 클래스는 메소드 프로파일 범위에 포함되지 않는다. 그리고 특정 인터페이스를 구현한 모든 클래스를 메소드 프로파일 범위에 포함시키려면 제니퍼 에이전트의 profile_interface 옵션을 사용한다. 예를 들어, example.eai.IBusinessManager 인터페이스를 구현한 모든 클래스를 메소드 프로파일 범위에 포함시키려면 다음과 같이 설정한다.

profile_interface = example.eai.IBusinessManager

그러나 이 경우에 직접적으로 구현한 클래스만이 메소드 프로파일 범위에 포함된다. A 클래스가 example.eai.IBusinessManager 인터페이스를 구현하고 B 클래스가 A 클래스를 상속했다면, A 클래스는 메소드 프로파일 범위에 포함되지만 B 클래스는 메소드 프로파일 범위에 포함되지 않는다. 그리고 클래스의 이름을 이용해서도 메소드 프로파일 범위를 설정할 수 있다. 이 경우에는 제니퍼 에이전트의 profile_prefix, profile_postfix, profile_ignore_prefix, profile_ignore_postfix 옵션을 사용한다. 이름이 example.biz로 시작하는 모든 클래스를 메소드 프로파일 범위에 포함시키려면 다음과 같이 설정한다.

profile_prefix = example.biz

또한 이름이 Manager로 끝나는 모든 클래스를 메소드 프로파일 범위에 포함시키려면 다음과 같이 설정한다.

profile_postfix = Manager

그리고 특정 이름으로 시작하는 클래스를 메소드 프로파일 범위에서 제외하려면 제니퍼 에이전트의 profile_ignore_prefix 옵션을 사용한다. 이 옵션은 다른 모든 옵션에 우선한다.

profile_ignore_prefix =

그리고 특정 이름으로 끝나는 클래스를 메소드 프로파일 범위에서 제외하려면 제니퍼 에이전트의 profile_ignore_postfix 옵션을 사용한다. 이 옵션은 다른 모든 옵션에 우선한다.

profile_ignore_postfix =

제니퍼 에이전트의 profile로 시작하는 옵션들로 동일한 내용을 다양한 방법으로 설정할 수 있다. 메소드 프로파일 범위를 설정하는데 있어서 profile_target_method 옵션으로 실제로 메소드 프로파일 범위에 포함시킬 메소드만을 설정하도록 한다.

예를 들어, pkg.ClassA와 pkg.ClassB 클래스가 있다. 여기서 ClassA 클래스의 run 메소드와 ClassB 클래스의 process 메소드를 메소드 프로파일 범위에 포함시켜야 한다고 가정한다. 그런데 ClassB 클래스에 run 메소드가 존재하고 이 메소드는 메소드 프로파일 범위에서 제외하려면 다음과 같이 설정한다.

profile_class = pkg.ClassA;pkg.ClassB
profile_target_method = run;process
profile_ignore_method = pkg.ClassB.run

또는 다음과 같이 설정할 수도 있다.

profile_class = pkg.ClassA;pkg.ClassB
profile_target_method = pkg.ClassA.run;pkg.ClassB.process

메소드 크기로 메소드 프로파일 범위를 설정할 수도 있다. 제니퍼 에이전트의 profile_method_max_byte 옵션으로 메소드 프로파일 범위에 포함시킬 메소드 최대 크기를 설정한다. 기본 값은 32000이고 단위는 바이트이다.

profile_method_max_byte = 32000

자바 메소드 크기가 64 KB를 넘을 수 없기 때문에 메소드 크기가 64 KB를 넘으면 에러가 발생한다. 메소드 프로파일링을 위해서 제니퍼가 해당 메소드에 추적 코드를 삽입하기 때문에 본래보다 메소드 크기가 증가한다. 따라서 이 옵션을 50 KB 이상으로 설정하지 않도록 한다.

그리고 제니퍼 에이전트의 profile_method_min_byte 옵션으로 메소드 프로파일 범위에 포함시킬 메소드 최소 크기를 설정한다. 기본 값은 0이고 단위는 바이트이다.

profile_method_min_byte = 0

getter와 setter와 같이 로직이 단순한 메소드를 메소드 크기에 기반해서 메소드 프로파일 범위에서 제외할 수 있다.

프로파일링 제어

너무 많은 메소드를 프로파일링하면 제니퍼 서버가 수집하는 데이터 양이 크게 증가하는 문제가 있다. 이를 방지하기 위해서 한 트랜잭션이 수행되는 과정에서 프로파일되는 최대 항목 개수를 제니퍼 에이전트의 profile_buffer_size 옵션으로 설정할 수 있다. 기본 값은 1000이다.

profile_buffer_size = 1000

메소드 프로파일 범위를 설정해도 메소드 프로파일링은 이루어지지 않는다. 제니퍼 에이전트의 profile_default_on 옵션을 true로 설정해야 메소드 프로파일 범위에 포함된 메소드에 대한 메소드 프로파일링이 이루어진다. 기본 값은 false이다.

profile_default_on = true

메소드 프로파일링에 따른 성능 저하를 방지하기 위해서 이 옵션을 true로 설정하는 것은 권장하지 않는다.

profile_default_on 옵션을 false로 설정한 경우에도 제니퍼 에이전트를 설치한 자바 애플리케이션을 재시작하지 않고 특정 클래스에 대해서만 메소드 프로파일링 On/Off를 제어할 수 있다. 이를 위한 방법은 [다이나믹 프로파일링]을 참조한다.

profile_default_on 옵션은 전체 메소드 프로파일 범위에 대한 On/Off를 제어한다. 그런데 특정 옵션으로 설정한 메소드 프로파일 범위에 대해서만 On/Off를 제어할 수 있다. 예를들어, profile_class 옵션으로 설정한 메소드 프로파일 범위에 대한 On/Off를 제어하려면 제니퍼 에이전트의 profile_class_on 옵션을 사용한다. 기본 값은 false이다.

profile_super 옵션으로 설정한 메소드 프로파일 범위에 대한 On/Off를 제어하려면 제니퍼 에이전트의 profile_super_on 옵션을 사용한다. 기본 값은 false이다.

profile_super_on = true

profile_interface 옵션으로 설정한 메소드 프로파일 범위에 대한 On/Off를 제어하려면 제니퍼 에이전트의 profile_interface_on 옵션을 사용한다. 기본 값은 false이다.

profile_interface_on = true

Boot Class 프로파일링

제니퍼 에이전트를 javaagent로 설치한 경우에는 -Xbootclasspath에 설정된 클래스도 프로파일링할 수 있다. 단, 이 경우에도 java 패키지는 프로파일링할 수 없다. 이를 위해서는 제니퍼 에이전트의 enable_hooking_boot 옵션을 true로 설정한다. 기본 값은 false이다.

enable_hooking_boot = true

일반적으로 Boot Class 패스에는 시스템적인 성격의 클래스만을 설정한다. 따라서 업무 클래스가 Boot Class 패스에 설정된 경우에만 예외적으로 사용하는 것을 권장한다.

다이나믹 프로파일링

제니퍼 에이전트를 설치한 자바 애플리케이션 재시작없이 동적으로 메소드 프로파일 범위 설정을 변경하거나 메소드 프로파일 범위에 포함된 클래스의 프로파일 On/Off를 제어하는 것을 다이나믹 프로파일링이라고 한다. 단, 제니퍼 에이전트를 javaagent로 설치한 경우만 자바 애플리케이션 재시작없이 메소드 프로파일 범위 설정을 변경할 수 있다. [실시간 모니터링 | 프로파일] 메뉴에서 메소드 프로파일 범위에 포함된 클래스에 대한 프로파일 On/Off를 제어할 수 있다.

다이나믹 프로파일링

메소드 프로파일 범위에 포함된 클래스를 확인하는 방법은 다음과 같다. 제니퍼 에이전트 선택 영역에서 메소드 프로파일 범위를 확인할 제니퍼 에이전트를 선택한다. 화면 왼쪽에 선택한 제니퍼 에이전트를 설치한 자바 애플리케이션 패키지 구조가 트리 형태로 나타난다. 패키지 트리에서 특정 패키지를 선택하면 화면 오른쪽에 해당 패키지에 있는 클래스 중에서 메소드 프로파일 범위에 포함된 클래스 목록이 나타난다. 클래스 목록에서 프로파일 칼럼이 체크되어 있는 클래스는 프로파일링이 수행되고 있음을 의미한다.

해당 패키지에 있는 모든 클래스가 나타나는 것이 아니라 profile로 시작하는 옵션들로 설정한 메소드 프로파임 범위에 포함된 클래스들만이 나타난다.

특정 클래스에 대한 메소드 프로파일 On/Off는 다음과 같은 방법으로 변경한다.

패키지 트리에서 default package를 선택하면 클래스 4개가 항상 표시된다. 제니퍼 에이전트 동작 방식을 제어하는데 이 클래스들을 사용할 수 있다.

제니퍼 에이전트 제어를 위한 클래스

클래스

설명

기본 프로파일 상태

PROFILE_MESSAGE

프로파일을 Off로 변경하면 메시지 유형 프로파일 항목을 수집하지 않는다. 단, getConnection과 관련한 메시지는 영향을 받지 않는다.

true

PROFILE_PARAM

프로파일을 Off로 변경하면 [파라미터와 반환 값 추적]에 설명한 기능이 동작하지 않는다.

true

PROFILE_SQL

프로파일을 Off로 변경하면 SQL 유형 프로파일 항목을 수집하지 않는다.

true

PROFILE_USER_CONTROL

향후 기능 확정을 위한 것으로 현재 기능에는 영향을 미치지 않는다.

false

메소드 프로파일 범위에 포함되어 있는 모든 클래스들에 대한 프로파일 On/Off 변경은 화면 하단에 있는 [전체 프로파일 설정]과 [전체 프로파일 해제] 버튼을 이용한다.

전체 메소드 프로파일 범위 On/Off 제어

제니퍼 에이전트를 javaagent로 설치한 경우에는 자바 애플리케이션 재시작없이 메소드 프로파일 범위 설정을 변경할 수 있다. 이를 LWST 재설정이라고 한다.

LWST 재설정 방법은 다음과 같다.

LWST 재설정은 모든 클래스가 아닌 선택된 클래스에만 반영된다. 예를 들어, example.ClassA와 example.ClassB 클래스가 있는데 이 두 클래스는 메소드 프로파일 범위에 포함되어 있지 않다. LWST 재설정을 위해서 profile_class 옵션을 다음과 같이 수정하였다.

profile_class = example.ClassA;example.ClassB

LWST 재설정 팝업 창 로딩 클래스 목록 탭에서 example.CassA 클래스만을 선택한 후에 하단에 있는 [적용] 버튼을 클릭했다면, example.ClassA 클래스는 메소드 프로파일 범위에 포함되지만, example.ClassB 클래스는 메소드 포로파일 범위에 포함되지 않는다. 단, 제니퍼 에이전트를 설치한 자바 애플리케이션을 재시작하면 example.ClassB 클래스도 메소드 프로파일 범위에 포함된다.

다이나믹 스택 트레이스

모든 클래스의 모든 메소드를 프로파일링은 하는 것은 부하가 크고, 수집한 프로파일 데이터 중에서 적은 일부만을 분석 목적으로 사용하기 때문에 효율적이지 못하다. 따라서 성능이나 기능 장애가 있는 애플리케이션에 직접적으로 관련된 클래스만을 프로파일링을 하는 것이 효율적이다. 그런데 외부 패키지나 직접 개발하지 않은 소스 코드를 사용하는 경우에는 특정 애플리케이션과 직접적으로 관련된 클래스들을 파악하는 것은 쉬운 일이 아니다. 바로 다이나믹 스택트레이스는 특정 애플리케이션과 직접적으로 관련된 클래스들을 찾는 기능이다. 메소드 프로파일 범위에 포함된 클래스 중에서 임의의 클래스를 기반으로 자바 스택을 추적함으로써 트랜잭션 흐름을 쉽게 파악하고, 프로파일 대상 클래스를 쉽게 선별할 수 있도록 도와 준다.

다이나믹 스택트레이스 기능을 사용하기 위해서는 특정 애플리케이션에서 사용하고 있는 1개 이상의 클래스는 파악하고 있어야 한다.

다이나믹 스택트레이스 기능은 다음과 같이 사용한다.

스택트레이스에 포함되어 있는 모든 클래스에 대한 메소드 프로파일을 On으로 설정하는 방법은 다음과 같다.

스텍트레이스

기본적으로 해당 클래스를 사용한 임의의 첫번째 트랜잭션과 관련한 스택트레이스가 기록된다. 그런데 특정 애플리케이션에 의한 트랜잭션과 관련한 스택트레이스가 기록되게할 수 있다. 이는 다음과 같은 방법으로 설정한다.

트랜잭션을 수행하는 자바 쓰레드가 아닌 백그라운드 쓰레드가 임의의 클래스를 사용하는 것에 대한 스택트레이스도 기록할 수 있다.

파라미터와 반환 값 추적

메소드 프로파일을 수행할 때 특정 메소드의 파라미터 값이나 반환 값을 함께 수집할 수도 있다. 단, 메소드 파라미터나 반환 값의 유형이 java.lang.String이어야만 한다. 예를 들어, 다음 클래스에 대한 메소드 파라미터 값과 반환 값을 추적하는 방법은 다음과 같다.

package pkg;
public class ClassC {
   public void ptrace1(String value) {
      System.out.println("ClassC.process:" + value);
   }
   public void ptrace2(int x, String value) {
      System.out.println("ClassC.process:" + value);
   }
   public String rtrace() {
      return "It's the return value";
   }
}

ClassC 클래스의 ptrace1 메소드 파라미터 값을 추적하려면 제니퍼 에이전트의 lwst_profile_method_using_param 옵션을 다음과 같이 설정한다.

lwst_profile_method_using_param = pkg.ClassC.ptrace1(String)

java.lang.String 유형 파라미터가 여러 개인 메소드는 첫번째 String 유형 파라미터 값만이 수집된다.

클래스 이름과 메소드 이름을 점[.]으로 구분하여 설정하고 클래스 이름은 패키지 이름을 포함하여야 한다. 메소드는 파라미터 유형을 명시하여 지정해야 한다. 두개 이상의 메소드를 설정하려면 세미콜론[;]을 구분자로 구분한다. 예를 들어, ptrace2 메소드 파라미터 값도 추적하려면 다음과 같이 설정한다.

lwst_profile_method_using_param = pkg.ClassC.ptrace1(String);pkg.ClassC.ptrace2(int,String)

메소드 반환 값은 제니퍼 에이전트의 lwst_profile_method_using_return 옵션으로 설정한다.

lwst_profile_method_using_return = pkg.ClassC.rtrace()

두개 이상의 메소드를 설정하려면 세미콜론[;]을 구분자로 구분한다. 이와 같이 설정하면 프로파일 데이터에서 다음 내용을 확인할 수 있다.

PARAM[test param] ClassC.ptrace1
PARAM[test param] ClassC.ptrace2
RETURN[It's the return value] ClassC.rtrace

호출되는 메소드 추적

메소드 내부 로직이 복잡한 경우에 profile_call옵션을 이용해 메소드 내부를 보다 상세하게 분석할 수 있다. 예를 들어, 다음과 같은 클래스가 있다.

package pkg;
public class ClassD {
   public void process() {
      // 단계 1
      ClassE e = new ClassE();
      e.run();
      // 단계 2
      ClassF f = new ClassF();
      f.run();
   }
}

ClassD 클래스의 process 메소드는 다음과 같이 이루어져 있다.

  1. 단계 1을 수행

  2. ClassE 객체를 생성한 후에 run 메소드를 호출

  3. 단계 2를 수행

  4. ClassF 객체를 생성한 후에 run 메소드를 호출

단계 1과 2에서는 다양한 로직이 수행되고 여러 메소드가 호출될 수 있다. 이 때 개별 메소드 응답 시간이 아닌 단계 1과 2의 수행 시간 자체를 측정하라면 제니퍼 에이전트의 profile_call 옵션을 사용한다. 먼저 profile_class 옵션으로 ClassD를 메소드 프로파일 범위에 포함시킨다.

profile_class = pkg.ClassD

그리고 profile_call 옵션을 다음과 같이 설정한다. 2개 이상은 세미콜론[;]을 구분자로 구분한다.

profile_call = pkg.ClassE.run;pkg.ClassF.run

메소드 이름이 같은 경우에는 별표[*]를 사용하여 설정할 수도 있다.

profile_call = *.run

이와 같이 설정하면 프로파일 데이터에서 다음 내용을 확인할 수 있다.

프로파일 데이터 - profile_call

profile_call 옵션에 설정된 메소드는 프로파일 데이터에 CALLED를 접두사로 표시된다. CALLED pkg.ClassE.run 프로파일 항목 Gap 시간이 단계 1의 수행 시간이고, CALLED pkg.ClassF.run 프로파일 항목 Gap 시간이 단계 2의 수행 시간이 된다. profile_call 옵션을 수정하면 제니퍼 에이전트를 설치한 자바 애플리케이션을 재시작해야 한다. 따라서 이 기능은 운영 시스템보다는 테스트 시스템에서 활용하는 것을 권장한다.

JSP 파일을 구간별로 추적할 때는 profile_call 옵션보다는 프로파일 API를 직접 사용하는 것을 권장한다. 자세한 사항은 [프로파일에 메세지 추가]를 참조한다.

사용자 아이디 추출

특정 메소드의 파라미터 값이나 반환 값을 사용자 아이디로 추출할 수 있다. 특정 메소드의 파라미터 값을 사용자 아이디로 추출하려면 제니퍼 에이전트의 userid_param 옵션을 설정한다. 해당 메소드의 java.lang.String 유형의 첫번째 파라미터를 사용자 아이디로 추출한다.

userid_param = pkg.UserManager.setId(String)

특정 메소드의 반환 값을 사용자 아이디로 추출하려면 제니퍼 에이전트의 userid_return 옵션을 설정한다. 이 때 메소드의 반환 유형은 java.lang.String 이어야 한다.

userid_return = pkg.UserManager.getId()

이렇게 추출한 사용자 아이디는 X-View에서 확인할 수 있다.

자바로딩 클래스 확인

정확한 트랜잭션 프로파일링을 위해서는 클래스가 어느 JAR 파일에서 로딩되었는지와 다른 클래스 혹은 인터페이스와의 종속 관계가 어떠한지를 확인할 필요가 있다.

클래스/Jar 체크

[장애 진단 | 유틸리티 | 클래스/Jar 검색] 메뉴에서 특정 클래스가 모니터링 대상 자바 애플리케이션의 어느 위치에 어떤 형태로 존재하는지를 검색할 수 있다. 클래스는 JAR 파일안에 포함되어 있을 수도 있고 특정 디렉토리에 있을 수도 있다.

이름이 동일한 클래스가 여러 곳에 존재할 수 있는데 이 기능을 통해서 모니터링 대상 자바 애플리케이션이 실제로 사용하는 클래스 위치를 손쉽게 파악할 수 있다.

클래스/Jar 검색

클래스 필드에 자바 패키지 이름을 포함한 클래스 이름을 입력한 후에 [검색] 버튼을 누르면 모니터링 대상 자바 애플리케이션이 실제로 사용하고 있는 클래스 위치가 나타난다. 앞의 예제는 java.lang.String 클래스가 모니터링 대상 자바 애플리케이션의 /usr/local/j2sdk1.4.2_08/jre/lib 디렉토리에 위치한 rt.jar 파일 속에 있음을 보여준다.

로딩 클래스 목록

[장애 진단 | 유틸리티 | 로딩 클래스 목록] 메뉴에서 모니터링 대상 자바 애플리케이션에서 로딩된 모든 클래스 목록을 확인할 수 있다.

로딩 클래스 목록

클래스 이름을 클릭하여 클래스 상세 정보를 확인할 수 있다.

로딩 클래스 상세 정보