Background Image
조회 수 20058 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

오래 걸리는 질의 추출하기

소개: 브로커에 관한 상태를 모니터링하는 cubrid broker status를 이용하여 수행시간이 긴 질의 및 동일 시간에 수행 중인 질의를 추출하는 방법을 소개한다.

적용 대상: CUBRID2008, UNIX/Linux

 

오래 걸리는 질의 추출하기

cubrid broker status을 수행하면 브로커의 상태를 모니터링 할 수 있다. 출력되는 내용에서 STATUS에 해당하는 값 중 BUSY는 현재 질의 처리가 진행 중인 것을 나타내며 질의 문도 간단하게 함께 출력된다.

% broker1  - cub_cas [23924,53000] /home/test/CUBRID/log/broker/broker1.access /home/test/CUBRID/log/broker/error_log/broker1.error

  job_queue : 0, AUTO-ADD-ON, TIMEOUT:300, SQL-LOG-ON:AB:100000, KC:AUTO

----------------------------------------------------

ID   PID     C PSIZE STATUS        LAST ACCESS TIME

----------------------------------------------------

 1 23929  3954 11024  BUSY       2009/05/13 16:39:17 execute update tn_visit_counting set visit_count=2 where visit_ilja='20090310'

 2 23930  3894  9956  IDLE       2009/05/13 16:39:20

cubrid broker status는 수행할 때 마다 수행 시점의 브로커 상태를 보여준다. 처음 수행했을 때 위 예제의 update 질의가 실행되고 있었는데 3초 후에 두 번째 수행했을 때도 동일한 질의 가 나타난다면 그때까지 질의 처리가 완료되지 않았다는 이야기가 된다.

본 문서에서는 이러한 cubrid broker status 기능을 이용하여 수행 시간이 긴 질의를 추출하는 방법을 소개한다.

모니터링 스크립트

아래 스크립트를 작성한다. 스크립트 파일이름은 편의상 mb.sh로 지칭한다.

#!/bin/sh

broker_name=$1

sec=$2

file_name=$3

echo "monitor start" > $file_name

while [ true ]

do

busy=`cubrid broker status $broker_name | grep BUSY`

# 브로커 상태 정보에서 BUSY인 것 만 추출

if [ ! -z "$busy" ]; then

# BUSY인 것이 있는 경우 로그 기록

date=`date`

echo "$date" >> $file_name

echo "ID   PID     C PSIZE STATUS        LAST ACCESS TIME" >> $file_name

echo "=======================================================================" >> $file_name

echo "$busy" >> $file_name

echo "=======================================================================" >> $file_name

fi

sleep $sec

# 입력 받은 주기() 간격으로 cubrid broker status를 수행.

done

위 스크립트는 수행 시 인자로 브로커명, 모니터링 주기(), 로그 저장 파일명을 입력 받는다.

cubrid broker status는 수행 시 브로커명을 입력 받으면 해당 브로커에 대한 정보만 출력한다. 한 시스템에 여러 개의 브로커가 운영될 수 있기 때문에 추출하고자 하는 브로커를 지정하여 정보를 가져오도록 한 것이다.

브로커 상태 정보 중에 BUSY가 포함되어 있으면 추출한 시간과 함께 BUSY 로그를 입력 받은 로그 저장 파일에 저장하고, 이 작업을 모니터링 주기로 반복 수행한다.

스크립트 실행

작성한 스크립트(mb.sh)를 브로커명, 주기, 파일명을 입력하여 백그라운드에서 수행되도록 실행한다.

[test ~]$ sh mb.sh broker 2 br_1.log &

예제는 2초 간격으로 cubrid broker status broker를 수행하고, 이때 BUSY 상태인 로그를 추출하여 br_1.log라는 파일에 저장하는 작업을 백그라운드에서 수행한다. 이는 수행 시간이 2초 이상 되는 질의를 추출하겠다는 것이고, 수행시간이 더 긴 질의를 추출하려면 두 번째 인자를 더 큰 수치를 주면 된다.

결과 로그 분석

monitor start

2009. 05. 13. () 16:39:14 KST

ID   PID     C PSIZE STATUS        LAST ACCESS TIME

=======================================================================

 1 23929  3851 11024  BUSY       2009/05/13 16:39:14 execute update tn_visit_counting set visit_count=2 where visit_ilja='20090310'

 2 23930  3704  9960  BUSY       2009/05/13 16:39:14 execute select * from tn_visit_counting where visit_ilja='20090310'

=======================================================================

2009. 05. 13. () 16:39:16 KST

ID   PID     C PSIZE STATUS        LAST ACCESS TIME

=======================================================================

 1 23929  3851 11024  BUSY       2009/05/13 16:39:14 execute update tn_visit_counting set visit_count=2 where visit_ilja='20090310'

 2 23930  3734  9960  BUSY       2009/05/13 16:39:15 execute select * from tn_visit_counting where visit_ilja='20090310'

=======================================================================

위 로그는 2초 단위로 BUSY 상태인 로그를 추출한 결과다.

처음 두 개의 수행 중인 질의가 있고, 2초 후에도 두 개의 수행 중인 질의가 있다.

그렇다면 이중 2초 이상 수행 중인 질의는 어떤 것일까?

여기서 수행시간이 긴 질의로써 판단하는 기준은 ID, PID, C, LAST ACCESS TIME 모두 일치 여부이다.

따라서 위 예제에서는 ID 1인 질의만 2초 이상 수행 중인 질의에 해당한다.

ID 2는 동일한 질의처럼 보이나 처음 것은 16:39:14에 수행된 질의이고 두 번째 것은 16:39:15에 수행된 것으로 서로 다른 트랜잭션에서 수행한 것이다.

이 결과에는 상세 내용은 기록되지 않으므로 ID(cas number) 값과 LAST ACCESS TIME을 가지고 해당 sql log에서 상세 내역을 확인해야 한다.

Sql log $CUBRID/log/broker/sql_log <broker_name>_<ID>.sql.log 파일로 존재한다.

위 예제에 따르면 broker1_1.sql.log 파일이 해당하며, 해당 시간의 질의를 확인해보면 execute ... time 부분에서 질의 처리에 소요된 시간을 확인할 수 있다.

05/13 16:39:14.290 (3721) prepare 0 update tn_visit_counting set visit_count=2 where visit_ilja='20090310'

05/13 16:39:14.291 (3721) prepare srv_h_id 1 (PC)

05/13 16:39:14.316 (3721) execute srv_h_id 1 update tn_visit_counting set visit_count=2 where visit_ilja='20090310'

05/13 16:39:17.317 (3721) execute 0 tuple 1 time 3.001 // 질의 수행 시간

05/13 16:39:17.317 (0) auto_commit

05/13 16:39:17.363 (0) auto_commit 0

*** 3.073

결과 로그 활용

종종 서비스를 하는 중 서비스가 느려져서 원인이 되는 질의 문을 찾아 튜닝을 하고자 하는데 질의 처리시간이 오래 걸렸다고 생각한 질의가 실제는 금방 처리되는 질의 인 경우가 있다. 질의 하나에 의해서 부하가 발생하는 경우도 있겠지만 이런 경우에는 여러 질의가 동시에 수행되는 과정에서 다른 질의 들에 영향을 받아 성능이 느려지는 경우인 것이다. 이러한 경우에 sql log를 모두 뒤져서 해당 시점의 질의들을 모두 찾아 확인을 해야 하는데 쉬운 작업이 아니다. 이 스크립트를 작성하게 된 가장 큰 이유가 바로 여기에 있다.

위에서도 설명했듯이 결과 로그에는 해당 시간대에 수행 중인 질의가 기록된다. 그렇기 때문에 위와 같이 수행시간이 긴 질의를 찾아내는 작업뿐만 아니라 동일 시간대에 수행 중인 질의들을 확인 할 수 있고 이를 통해 어떤 질의가 실제 성능에 큰 영향을 미치고 있는 지를 확인해볼 수 있다.


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
46 CCI/DB API CCI-API 에서 OID 사용 예제 file 남재우 2009.07.01 24861
45 CCI/DB API CCI-API 사용 예제 file 남재우 2009.07.01 25103
44 PHP CUBRID_기술문서_CUBRID PHP 함수 unisql_ 계열 cubrid_로 변환하기 file 남재우 2009.06.23 22355
43 PHP cubrid_fetch_all 함수 추가하기 2 남재우 2009.06.16 20828
42 기타 Oracle의 SYS_CONNECT_BY_PATH 함수 흉내내기 CUBRID_DEV 2009.06.15 26526
41 Java CUBRID에서 log4sql을 사용하자 정병주 2009.06.12 44302
» 기타 오래 걸리는 질의 및 동일 시간에 수행 중인 질의 추출하기 손승일 2009.05.26 20058
39 Java jsp용 jdbc 샘플입니다. file 시난 2009.05.25 47606
38 Java iBATIS framework with CUBRID file 웁쓰 2009.05.19 54546
37 기타 CUBRID와 타DBMS의 python 사용방법 비교 cubebridge 2009.05.19 29520
36 Java SQuirreL SQL Client에서 CUBRID 사용하기 3 Prototype 2009.04.18 34533
35 Java Power*Architect 에서 CUBRID 사용하기 Prototype 2009.04.18 23879
34 Java AquaDataStudio 에서 CUBRID 사용하기 Prototype 2009.04.18 23666
33 Install CUBRID Manager 사용시 로그인에 대하여 1 file admin 2009.04.01 42038
32 Java Spring framework 사용 예제 admin 2009.04.01 53119
31 기타 connect by 구현 방법 admin 2009.04.01 52371
30 기타 python 에서 broker_log_top 사용 1 admin 2009.04.01 17830
29 기타 오라클 개발자를 위한 CUBRID 개발 안내 1 admin 2009.04.01 49817
28 Linux HP-UX에서 CUBRID 사용을 위한 kernel 설정값 조정 1 admin 2009.04.01 54135
27 Linux cron을 이용한 백업 자동화 admin 2009.04.01 33118
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales