[08] V$SERVICEMETRIC, V$SERVICEMETRIC_HISTORY 뷰를 이용한 서비스 성능관리 방안

똘똘님. 지난 포스팅에서 정리해주신 서비스 별 성능 통계를 제공해주는 다양한 뷰에 대해서 학습 중입니다. 다른 뷰들은 대부분 쉽게 이해가 되는데요. V$SERVICEMETRIC 뷰와 V$SERVICEMETRIC_HISTORY 뷰의 차이를 정확히 모르겠습니다. 그리고 CALLSPERSEC 칼럼의 수치가 실제 실행 횟수보다 크게 나오는 것 같습니다. 이에 대한 설명을 부탁드려도 될까요?

네. 공부할수록 궁금한 게 많아지는건 아주 당연하고도 좋은 현상입니다. 그럼 시작해볼까요?

8-1. V$SERVICEMETRIC 뷰와 V$SERVICEMETRIC_HISTORY 뷰의 차이점


뷰의 이름만으로 보면, 하나는 현재 데이터를 제공하고 다른 하나는 이력 데이터를 제공한다는 점은 쉽게 인지할 수 있으나, 조금 더 중요한 차이점이 있습니다. V$SERVICEMETRIC 뷰는 런타임 로드 밸런싱을 위해 사용되고, V$SERVICEMETRIC_HISTORY 뷰는 서비스 별 성능 관리를 위해 사용되다는 점입니다. (표-1 참조) [런타임 로드 밸런싱에 대해서는 별도 포스팅 예정입니다]

표-1. V$SERVICEMETRIC 뷰와 V$SERVICEMETRIC_HISTORY 뷰 비교

  V$SERVICEMETRIC  V$SERVICEMETRIC_HISTORY
 주요 목적  런타임 로드 밸런싱 (RLB – Runtime Load Balancing)  서비스 별 성능 관리
 RLB용 칼럼  GOODNESS  없음
 제공 데이터  서비스 별로 2개의 성능 통계를 제공 (1개는 최근 5초, 1개는 최근 1분)  서비스 별로 5초 단위의 성능 통계 이력 (최근 2분) 및 1분 단위의 성능 통계 이력 (최근 1시간) 제공

 

8-2. 각 뷰에서 제공하는 성능 통계 데이터 구간


“표-1″에서는 최근 5초, 최근 1분이라고 기술했으나, 보다 정확한 구간은 “그림-1″과 같습니다.

그림-1. 각 뷰에서 제공하는 성능 통계 데이터 구간 설명

8-1

8-3. DBTIMEPERSEC 칼럼 시간 단위


대부분의 칼럼들은 매뉴얼에 정확히 기재되어 있으나 DBTIMEPERSEC 칼럼은 단위가 기재되어 있지 않습니다. 해당 칼럼의 단위는 1/100초 입니다 (참고로, 시간 관련 칼럼들의 단위를 “표-2″에 기술해 두었습니다)

표-2. 칼럼 별 시간 단위

 칼럼명  단위
 INTSIZE_CSEC  centi-Second (1/100초)
 ELAPSEDPERCALL  micro-Second (1/1,000,000초)
 CPUPERCALL  micro-Second (1/1,000,000초)
 DBTIMEPERCALL  micro-Second (1/1,000,000초)
 DBTIMEPERSEC  centi-Second (1/100초)

8-4. CALLSPERSEC 칼럼의 이해


매뉴얼에 보면 CALLSPERSEC 칼럼의 설명은 “Number of user calls per second”, 즉, 초당 발생한 “user calls”라고 명시되어 있습니다. 다시 말해, 해당 칼럼에서 제공하는 수치는 SQL의 실행 횟수가 아닌 “user calls”라는 점을 주의해야 합니다. “user calls”는 아래와 같은 3가지 유형의 콜의 횟수를 합한 수치를 제공합니다.

  1. PARSE call
  2. EXEC call
  3. FETCH call

예를 들어, 1건을 fetch하는 SQL을 수행하면 3개의 call (각 단계별 1회)이 발생합니다. 만일, fetch 해야할 레코드가 많다면 그만큼 많은 FETCH call이 발생하게 됩니다. 예를 들어 설명하겠습니다. ONLINE_SRV 서비스에 속하는 online1.jsp는 1000건을 fetch하는 SQL을 수행합니다. 이때, ONLINE_SRV의 CALLSPERSEC 수치는 얼마일까요?

예시-1. online1.jsp 예제

<%@ page language=”java” contentType=”text/html; charset=UTF-8″  pageEncoding=”UTF-8″%>
<%@ page import=”java.sql.*”%>
<%@ page import=”javax.naming.*”%>
<%@ page import=”javax.sql.*”%>
<html>
<head>
<body >
<%
Integer v1 = null;
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
Context initContext = new InitialContext();
Context envContext  = (Context) initContext.lookup(“java:/comp/env”);
DataSource datasource = (DataSource) envContext.lookup(“jdbc/onlinesrv”);
conn = datasource.getConnection();
st=conn.createStatement();
String sql = “select c1 from t1 where rownum<=1000“;
rs = st.executeQuery(sql);
while (rs.next()) {
v1 = rs.getInt(1);
%>
<%=v1 %>
<%
}
} catch (Exception e){
e.printStackTrace(System.out);
}
finally {
st.close();
rs.close();
conn.close();
}
%>
</body>
</html>

예시-2. online1.jsp를 수행한 후에 V$SERVICEMETRIC 뷰 조회

select to_char(begin_time,'HH24:MI:SS') begin_time,
       to_char(end_time, 'HH24:MI:SS') end_time,
       intsize_csec interval, 
       round(callspersec*intsize_csec/100,1) calls_in_interval, -- 구간동안 발생한 횟수 
       callspersec -- 초당 발생 횟수
from   v$servicemetric
where  service_name='ONLINE_SRV';

BEGIN_TI END_TIME   INTERVAL CALLS_IN_INTERVAL CALLSPERSEC
-------- -------- ---------- ----------------- -----------
12:12:22 12:12:27        500               102        20.4

Note
CALLSPERSEC 칼럼 값은 초당 값 (Value/Sec)이므로, 구간 사이에 발생한 값 (Delta)으로 환산해서 설명하도록 하겠습니다. 조회 결과를 보면, CALLS_IN_INTERVAL 칼럼 값은 102입니다. 예상과 다르죠? 102인 이유는 PARSE call 1회, EXEC call 1회, FETCH call 100회를 수행했기 때문입니다. 또한, 1000건을 fetch하는데 FETCH call이 100회인 이유는 JDBC가 기본적으로 10개씩 레코드를 fetch(배열 크기=10)하기 때문입니다. 그렇다면 배열 크기를 증가시키면 CALLSPERSEC 칼럼 값에 변화가 있을까요?

8-5. Array 크기 변경 후 CALLSPERSEC 값의 변화 확인


setFetchSize 함수를 이용해서 배열 크기를 증가시킨 후 테스트를 수행해보겠습니다.

예시-3. 배열 크기 증가

st=conn.createStatement();
st.setFetchSize(100);

예시-4. 수행 결과 확인

select to_char(begin_time,'HH24:MI:SS') begin_time,
       to_char(end_time, 'HH24:MI:SS') end_time,
       intsize_csec interval, 
       round(callspersec*intsize_csec/100,1) calls_in_interval, -- 구간동안 발생한 횟수 
       callspersec -- 초당 발생 횟수
from   v$servicemetric
where  service_name='ONLINE_SRV';
BEGIN_TI END_TIME   INTERVAL CALLS_IN_INTERVAL CALLSPERSEC
-------- -------- ---------- ----------------- -----------
12:13:02 12:13:07        500                12         2.4

조회 결과를 보면, CALLS_IN_INTERVAL 칼럼 값이 12로 변경된 것을 알 수 있습니다. 즉, 배열 크기 증가에 따라 Fetch Call수가 100회에서 10회로 줄어든 것이 반영된 결과입니다.

8-6. 글을 마치며


서비스 별 응답 시간, CPU 사용 시간 및 Call 횟수를 분석하는데 있어서 V$SERVICEMETRIC_HISTORY 뷰는 아주 유용한 데이터를 제공합니다. 실시간 데이터와 함께 최근 1시간의 데이터를 제공하므로, 성능 이력 또한 분석할 수 있다는 장점을 가지고 있습니다. 따라서, 서비스 별 성능 분석 시에 매우 유용하게 활용할 수 있을 것입니다.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s