DB2에서는 수행된 SQL을 분석할 수 있는 db2 벤치마크 도구를 제공한다.

db2batch 라는 도구를 통하여 SQL이 수행된 시간, SQL이 수행되면서 사용된 bufferpool 정보들도 확인이 가능하다.

 

다양한 옵션이 많지만 장황하지 않는 선에서 다음과 같이 명령어를 정리해 본다.

db2batch -d 데이터베이스 -f SQL_파일명 -a ID/PWD -m 변수값 -z 출력_파일명 -iso cs -car cc -o r 1 p 2 e yes

 

가장 간단한 옵션은 –f 옵션까지만 주어서 SQL문을 실행시키면 된다.

원격에서 실행하는 경우 –a 옵션을 주어 접속 계정 정보를 명시적으로 지정하고, –m 변수를 통하여 동적 SQL을 수행할 수도 있다.

 

jennifer 등을 통하여 실행된 동적SQL의 변수 값이 추출 가능한데, SQL문과 변수 값 리스트가 별도로 나오기 때문에 “정적SQL”로 만드는 작업이 번거로울 수 있다.  이런 경우 –m 옵션을 통하여 동적으로 SQL 성능 분석을 편하게 할 수 있을 것 같다.

 

-z 옵션은 결과 출력 파일 지정하는 옵션이며, –iso 는 격리수준(isolation level)을 의미하며 V9.7 이후 currently committed 이 지원되므로 –car cc 옵션을 주어도 무방할 듯 하다.

 

-o 옵션에는 세부 옵션들이 다양하게 존재한다. r 옵션은 실행된 SQL의 return 값을 몇 개 반환하게 할 지를 결정하는 경우로 50건 이상 넘어가는 결과 값의 경우 샘플로 몇 개의 데이터를 확인하고자 할 때 지정하면 될 듯 하다.

p 옵션은 성능 분석을 위한 데이터 수집을 하도록 하는 옵션으로 2 인 경우는 실행된 SQL 수행시간 이외 application snapshot 정보도 수집해 준다. 숫자가 커질수록 수집되는 snapshot 정보는 많아 진다. 해당 SQL이 어떤 자원을 어떻게 사용했는지 확인하고자 한다면 (app. snapshot 정보로도 충분하다고 생각이 들지만 더욱 더 상세하게 수집하고자 하는 경우) 숫자를 조정하면 될 듯 하다.

 

e 옵션은 explain 정보를 수집하는 옵션인데, 테스트를 해 본 바 수집되지는 않았다.

 

1. Static SQL 테스트

   sample 데이터베이스의 employee 테이블을 대상으로한 select 문으로 수행하였다.

 

SQL 문

cat > sql.db2 <<EOF
select * from emp where empno > 10 ;
EOF

 

실행

db2 "CALL SYSPROC.SYSINSTALLOBJECTS('EXPLAIN','C',NULL,CURRENT SCHEMA)"
db2batch -d sample -f sql.db2 -a db2inst/db2inst -z sql1.out -iso cs -car cc -o r 1 p 2 e yes

 

결과

* Timestamp: Tue Aug 27 2013 00:43:11 KORST
---------------------------------------------

* SQL Statement Number 1:

select * from emp where empno > 10 ;

(생략) 데이터 1건 결과

* 41 row(s) fetched, 1 row(s) output.

* Elapsed Time is:       0.011069 seconds

            Monitoring Information

Instance name                                  = db2inst

(생략)

            Application Snapshot


Application handle                         = 49923
Application status                         = UOW Waiting

(생략)

* Summary Table:

Type      Number      Repetitions Total Time (s) Min Time (s)   Max Time (s)   Arithmetic Mean Geometric Mean Row(s) Fetched Row(s) Output
--------- ----------- ----------- -------------- -------------- -------------- --------------- -------------- -------------- -------------
Statement           1           1       0.011069       0.011069       0.011069        0.011069       0.011069             41             1

* Total Entries:              1
* Total Time:                 0.011069 seconds
* Minimum Time:               0.011069 seconds
* Maximum Time:               0.011069 seconds
* Arithmetic Mean Time:       0.011069 seconds
* Geometric Mean Time:        0.011069 seconds
---------------------------------------------

 

 

2. 동적SQL 예제(1)

SQL 문

cat > par.db2 <<EOF
--#PARAM 1000
--#PARAM 'M'
select * from emp where salary > ? and sex = ?;
EOF

 

실행

db2batch -d sample -f par.db2 -z par.out -iso cs -car cc -o r 5 p 2

 

 

3. 동적SQL 예제(2)

SQL 문

cat > par.ins <<EOF
1000 'M'
EOF


cat > par.db2 <<EOF
select * from emp where salary > ? and sex = ?;
EOF

 

실행

db2batch -d sample -f par.db2 -m par.ins -z par.out -iso cs -car cc -o r 5 p 2

리눅스 환경에서 DB2 설치를 하여 사용하는 경우 고려해야 되는 parameter가 존재한다.

 

1. randomize_va_space = 0

   DB2는 “자체 메모리 주소 체계”를 만들어 주소를 관리하도록 설계되어져 있다. 그래서 db2pd –osinfo 에서 "virtual memory” 라고 메모리 항목이 표현된 것을 볼 수 있다.

DB2에서 메모리 주소를 가상화해서 사용하다보니, OS 레벨에서 메모리 주소가 가상화 되어지는 것을 메모리 관리 안정성 면에서 위험할 수 있다고 보는 것 같다.

그래서 IBM TechNote에서 리눅스 운영체제에서 랜덤 주소 공간 사용을 하지 못하도록 설정을 권장하고 있다.

개인적으로 운영 서버의 경우 설정될 필요가 있다고 생각이 든다. (개발이나 테스트 용도의 경우는 별도 설정할 필요는 없을 것 같다)

 

(참고) https://www-304.ibm.com/support/docview.wss?uid=swg21365583

 

2. vm.swappingness=0

   DB2 교육 준비를 위하 자료를 찾다가 보게 된 parameter로 DB2 정보센터에는 별도 언급이 없는 것으로 알고 있다.

   물리적 메모리 가용 공간이 존재해도 어떤(?) 이유에서 SWAP 공간을 사용하는 경우가 발생하여 성능 저하가 될 수 상황을 방지하기 위하여  DB 서버 환경에서는 SWAP공간 사용을 막는 설정을 권장하는 것 같다.

   개인적으로 운영 서버 구축 시, OS 및 업무 담당자와 협의를 통하여 적용 여부를 결정하는 것이 좋을 것 같다.

 

(참고) http://seuis398.blog.me/70128624124

 

3. vm.overcommit_memory = 2 & vm.overcommit_ratio = 99

    자원이 극도로 적게 할당된 상태의 고객사 개발서버 환경에서 DB2 서버가 갑자기 죽어버리는 경우를 경험한 적이 있다. 리눅스는 OOM Killer (Out-of-Memory Killer) 라는 daemon이 작동을 하여 메모리 부족 시 메모리를 많이 잡고 있는 Application을 kill 시키도록 설계가 되어 있다.

 

    어떤 면에서는 안전 장치가 되겠지만, 중요한 업무를 수행하는 Application이라면 큰 문제를 야기할 수 있는 프로세스라고 할 수 있지 않을까 싶다.

    검색해서 본 문서를 보면 DB서버의 경우는 OOM Kill이 발생하지 않도록 메모리 overcommit을 허용하도록 설정하는 것을 권장하는 것 같다.

    실제 물리적 메모리보다 많이 가지고 있도록 설정을 해 놓아 OOM Kill에 의해 비정상적으로 죽는 것을 방지하고,  DB서버 자체적으로 메모리 부족 예외 상황을 만나 예외 처리 되도록 하는 것을 권장하는 것 같다.

 

    이 parameter도 운영 서버 구축 시에 OS 담당자 및 업무 담당자와의 협의를 통해 결정하는 것이 좋을 것 같다.

 

(참고) http://www.mimul.com/pebble/default/2013/05/10/1368171783727.html

         http://zalhae.blog.me/30150887343

'Note' 카테고리의 다른 글

[관리] db2dart 와 db2 inspect  (0) 2013.08.27
[성능] SQL 성능 분석  (0) 2013.08.26
[관리] row migration 과 row chain  (0) 2013.06.26
[설치] 비루트 설치  (0) 2013.06.19
[관리] 테이블 상태 확인(SQL0668N)  (0) 2013.05.28

Red Hat 기반 리눅스에 PHP 와 DB2 연동 테스트를 해 본 것이 2007년인데, 몇 일전 새롭게 테스트를 해 봤다가 마무리를 하지는 못했다.

차후 재 테스트를 하여 완료가 되는 경우 다시 정리하도록 한다.

 

1. 설치 환경 정보

   - 리눅스: CentOS 4.x  x86

   - 웹서버: Apache 2.2.6

   - 웹 Language: PHP 5.2.5

 

2. 설치 순서

   (1) DB2 V8.x 32bit Client 설치 및 구성

   (2) Apache 서버 설치 및 구성

   (3) PHP 설치

 

3. 다운로드

   - PHP : http://www.php.net/

   - 아파치: http://httpd.apache.org/

   - DB2 : http://www-01.ibm.com/support/docview.wss?rs=71&uid=swg27007053

 

4. DB2 Client 설치 정보 (설치 작업은 Skip)

   - 엔진 설치 위치: /opt/IBM/db2/V8.1/

   - 인스턴스 홈 : /home/db2inst1

 

5. Apach 서버 설치

    - 압축 풀기:  tar –xzvf httpd-2.2.6.tar.gz –C /usr/local/src

    -  설정

#> cd /usr/local/src/httpd-2.2.6
#> ./configure --prefix=/usr/local/apache2 \
    --enable-mods-shared=all \
    --enable-rewrite \
    --enable-so

............

config.status: creating build/pkg/pkginfo

config.status: creating build/config_vars.sh

config.status: creating include/ap_config_auto.h

config.status: executing default commands

 

    - 컴파일 및 설치

#> make && make install

…..

mkdir /usr/local/apache/man/man1

mkdir /usr/local/apache/man/man8

mkdir /usr/local/apache/manual

make[1]: Leaving directory `/usr/local/httpd-2.2.6

 

     - 검증

#> cd /usr/local/apache2/bin
#> ./apachectl start
#> ps -ef | grep httpd

root 12184 1 0 11:18 ? 00:00:00 /usr/local/apache2/bin/httpd -k start

daemon 12185 12184 0 11:18 ? 00:00:00 /usr/local/apache2/bin/httpd -k start

daemon 12186 12184 0 11:18 ? 00:00:00 /usr/local/apache2/bin/httpd -k start

daemon 12187 12184 0 11:18 ? 00:00:00 /usr/local/apache2/bin/httpd –k

 

    - 브라우저(firefox) 접속 확인 (http://localhost/)

      “It works” 문구가 담긴 웹 페이지 확인

 

    - 설정 (httpd.conf)

      위치: /usr/local/apache2/conf/httpd.conf

# Dynamic Share Object (DSO) Support

LoadModule php4_module modules/libphp4.so

 

#ServerName www.example.com:80

ServerName localhost:80

 

AddType application/x-httpd-php .php .php3 .php4 .php5 .html .htm

 

      위치: /usr/ld.so.conf

/usr/local/apache2/lib , /usr/local/apache2/modules 경로 추가

      확인: ldconfig 실행

 

 

6. PHP 설치 및 설정

   - 압축 풀기: tar –xzvf php-5.2.5.tar.gz –C /usr/local/src

   - DB2 환경변수 적용 (인스턴스_홈/sqllib/db2profile)

#> . /home/db2inst1/sqllib/db2profile

 

   - 설정

#> cd /usr/local/src/php5.2.5
#> ./configure --enable-cli \
     --disable-cgi \
     --with-apxs2=/usr/local/apache2/bin/apxs \
     --with-ibm-db2=/home/db2inst1/sqllib \
     --with-pdo-odbc=ibm-db2,/opt/ibm/db2/v8.1/ \
     --with-config-file-path=/usr/local/apache2/conf \
     --with-exec-dir=/usr/local/apache2/bin \
     --with-zlib --enable-sockets



+--------------------------------------------------------------------+

| License: |

| This software is subject to the PHP License, available in this |

| distribution in the file LICENSE. By continuing this installation |

| process, you are bound by the terms of this license agreement. |

| If you do not agree with the terms of this license, you must abort |

| the installation process at this point. |

+--------------------------------------------------------------------+

Thank you for using PHP.

 

     - 컴파일 및 설치

#> make && make install

pear/PEAR can optionally use package "pear/XML_RPC" (version >= 1.4.0)

[PEAR] PEAR - installed: 1.6.1

Wrote PEAR system config file at: /usr/local/etc/pear.conf

You may want to add: /usr/local/lib/php to your php.ini include_path

Installing PDO headers: /usr/local/include/php/ext/pdo/

     pecl 설치 프롬프트에 대해 ALL 선택 후, DB2의 인스턴스 경로 입력

 

     - php.ini 설정

#> cp php.ini-recommended /usr/local/apache2/conf/php.ini
#> vi /usr/local/apache2/conf/php.ini

include_path/usr/local/lib/php , /usr/local/include/php/ext/pdo/ 추가

pdo_odbc.db2_instance_name=db2inst1  추가

 

     - 검증

       (1) libphp5.so 라이브러리 존재 확인 ( ls –al /usr/local/apache2/modules )

       (2) php 파일 작성

#> cd /usr/local/apache2/htdocs
#> vi phpinfo.php3

<? phpinfo(); ?>

 

      (3) 아파치 서버 재기동

#> cd /usr/local/apache2/bin/apachectl stop
#> cd /usr/local/apache2/bin/apachectl start

 

      (4) 브라우저(firefox) 확인

           http://localhost/phpinfo.php3

 

 

7. DB2 연동

   (1) DB2 서버 카탈로그 작업

#> su – db2inst1
$> db2 catalog tcpip node db2node1 remote 127.0.0.1 server 50000 remote_instance DB2INST

$> db2 attach to db2node1 user db2inst using db2inst

$> db2 detach
$> db2 catalog db sample at node db2node1
$> db2 connect to sample user db2inst using db2inst

 

    * DB2 서버 접속 계정: db2inst

    * DB2 서버 DB 이름: sample

    * 통신 포트 번호: 50000

 

   (2) ODBC 함수를 통한 연동

    - 파일명: /usr/local/apache2/htdocs/odbc.php3

    - 코드

<?

$dsn="sample";

$user="db2inst";

$passwd="db2inst";

$sql="select * from employee";

if ($conn_id=odbc_connect("$dsn","$user","$passwd")){

echo "$dsn 연결 성공";

if($result=odbc_do($conn_id, $sql)) {

echo "'$sql'문 실행";

echo "result:: ";

odbc_result_all($result);

echo "freeing result";

odbc_free_result($result);

} else {

echo "'$sql' 실행에러";

}

echo "$conn_id : 연결닫음";

odbc_close($conn_id);

}else {

echo "$dsn연결실패";

}

?>

 

       - 확인 (http://localhost/odbc.php3)

 

  (3) PDO를 통한 연동

     - 파일명: /usr/local/apache2/htdocs/pdo.php3

     - 코드

<?php

$dbh = new PDO('odbc:SAMPLE','db2inst','db2inst');

echo "Connected\n";

$stmt= $dbh->prepare("call sp_test1(?)");

$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);

$stmt->execute();

print ":: sp_test1 returned ret_val: $return_value\n";

?>

 

Stored Procedure 코드

db2 +p -td"!" << EOF

Connect to sample user db2inst1 using db2inst1 !

drop procedure sp_test2 !

create procedure sp_test2(OUT out_par varchar(100))

language SQL

begin

declare v_cnt integer;

select count(midinit) into v_cnt from employee where midinit='' ;

set out_par = char(v_cnt);

end !

drop procedure sp_test1 !

create procedure sp_test1(OUT out_par varchar(100))

language SQL

begin

call sp_test2(out_par);

end !

terminate !

EOF

 

     - 확인 (http://localhost/pdo.php3)

'Laboratory' 카테고리의 다른 글

FBI (Function Based Index) 테스트  (0) 2012.12.23

+ Recent posts