쓰고자 하는 내용이 DB2 아키텍처에 해당될 수 도 있을 것 같은데, 고객사의 자바로 실행되는 프로시저관련 기술지원하면서 찾아본 내용들을 정리해 본다.

프로시저를 작성하게 되면 FENCED, NOT FENCED 옵션을 선언하게 된다. DB2 내에서 자체적으로 제공되는 내장(built-in) 루틴(함수, 프로시저, 패키지, 모듈)은 not fenced 옵션으로 실행이 되지만, 일반 사용자(개발자)등이 생성하는 루틴은  fenced로 선언을 한다.

함수나 프로시저에서 선언되는 fenced라는 것은 DB2 인스턴스를 생성할 때 지정하게 되는 분리사용자(fence user)와 관계가 깊다.

하나의 프로그램이 실행되는 것은 process (혹은 daemon)가 실행되어 짐을 의미하고, 이것은 다시 계정하고도 매핑이 된다. 즉 OS 상의 자원은 소유자에 의해서 할당되어 실행이 되어진다고 할 수 있겠다.

V9.5부터 DB2는 multi-thread 방식의 아키텍처로 변경되었고, 인스턴스를 기동하면 OS상에서 db2sysc(system controller)라는 프로세스가  db2 인스턴스 계정으로 실행이 된다.

이 db2sysc라는 프로세스 하위에는 (v9.1 이하에서는 프로세스로 존재했던) db2agent라는 thread가 존재한다. (이외 instance 및 db 레벨에서 실행되는 여러 프로세스들이 다 db2sysc 하위의 thread로 포함되었다)

db2agent가 하는 역할은 원격에서 접속이 되면 db2agent가 생성이 되고, 작업 요청을 db2agent가 받아서 db 내부로 던져주는 역할을 한다. db 내에서 응답을 주면 원격에 다시 그 결과를 통보해 주는 통로 역할을 한다. (어찌 보면  client 접속에 대해 전체적인 트랜잭션을 관리해 주는 관리자 프로세스라고 할 수 있겠다.)

db2agent로 인스턴스 계정의 소유로 자원을 받아 실행이 되며, db2sysc와도 관련을 갖고 행동하기 때문에, 작업에 대해 예외가 발생하여 db2agent 한 개가 crash가 되는 경우 db2sysc 까지 영향을 미쳐, 인스턴스가 비정상적으로 종료가 되는 상황이 발생한다.

인스턴스 계정으로 소유된 자원들이기에 하위의 프로세스, 쓰레드는 어느 하나가 문제가 발생해도 전체가 다 죽는 상황이 발생을 하게 된다.

DB2는 사용자 정의 함수(UDF)나 프로시저등의 사용자가 작성해서 사용하는 object들에 대해서는 인스턴스 소유로 실행되지 않도록 db2fmp라는 별도의 프로세스를 통해 처리되도록 설계를 하였고, 이 db2fmp 프로세스는 (db2 인스턴스를 생성할 때 필요한 분리사용자 계정) fence 계정 소유로 실행된다.

따라서, UDF나 Procedure가 들어있는 트랜잭션을 db2agent가 받게 되면 이것을 db2fmp에서 처리되도록 전달한다. db2fmp는 들어온 트랜잭션을 db쪽에 요청하여 작업 처리를 하고 결과를 db2agent에 전달하는 식으로 하여 작업 처리를 하게 된다.

DB2 V9.7 fixpack 2~3에 포함된 IBM JDK에 버그가 발생해서 자바기반의 UDF나 Procedure가 실행되면 db2fmp 프로세스가 CPU 90% 이상을 잡아 먹는 상황이 발생을 하였었다. (해결책은 IBM JDK 최신 버전을 받아 설치해서 DB2가 사용하도록 하면 된다.)

db2fmp에서 어떤 작업들이 실행되었는지는 db2pd –fmp 를 실행함으로 확인해 볼 수 있다.

명령어: db2pd –fmp

결과:

FmpPid     Bit   Flags      ActiveThrd PooledThrd ForcedThrd Active
966858     64    0x00000000 0          0          0          Yes   
 
   Active Threads:
     EduPid : 15455     ThreadId : 0     

FMP Process:
FmpPid     Bit   Flags      ActiveThrd PooledThrd ForcedThrd Active
 950308     64    0x00000003 1          0          0          Yes   
 
   Active Threads:
     EduPid : 14427     ThreadId : 2314     
        Routine ID     Timestamp
        65974          2010-11-11-17.26.19.274874

 

명령어: db2pd -fmpe pid=950308 genquery

결과:

FMP Process:
Address            FmpPid     Bit   Flags      ActiveThrd PooledThrd ForcedThrd Active IPCList
0x0780000000DDBD40 766078     64    0x00000003 5          1          0          Yes    0x0780000000E6EFC0
 
   Active Threads:
   Address            FmpPid     EduPid     ThreadId 
   0x0780000000E6D880 766078     25189      3342     
   0x0780000000DDFE00 766078     17736      3085     
   0x0780000000DDF240 766078     17479      2828     
   0x0780000000DDD500 766078     16708      2571     
   0x0780000000DDC7C0 766078     16451      2314     
 

WITH RTNHIST ( PID, TID, RTNID, RTNTIME) AS
( VALUES   ( 766078    , 3599      , 65960     , TIMESTAMP('2010-11-12-01.03.33.056630')),
           ( 766078    , 3342      , 65960     , TIMESTAMP('2010-11-12-01.02.33.762402')),
           ( 766078    , 3085      , 65974     , TIMESTAMP('2010-11-12-01.01.59.036435')),
           ( 766078    , 2828      , 67495     , TIMESTAMP('2010-11-12-01.01.58.972998')),
           ( 766078    , 2571      , 65974     , TIMESTAMP('2010-11-12-01.01.54.017851')),
           ( 766078    , 2314      , 67495     , TIMESTAMP('2010-11-12-01.01.51.854489')),
           ( 766078    , 3856      , 65960     , TIMESTAMP('2010-11-12-01.03.33.057850'))
)
SELECT R.PID, R.TID, R.RTNTIME, ROUTINESCHEMA, ROUTINENAME, SPECIFICNAME, ROUTINEID
FROM syscat.routines, RTNHIST as R
where ROUTINEID = R.RTNID
ORDER BY R.PID, R.TID, R.RTNTIME

특정 PID에 대해 어떤 SQL이 실행되었는지를 위와 같은 명령어를 통해서 확인할 수 있다.

만일 특정 루틴이 이런 문제를 발생했다면, 위와 같은 방식으로 찾아 낼 수 있지 않을까 하는 생각을 한다.

정보센터에도 자세한 내용은 나오지 않지만 flags에 대해서는 자세히 기술해 놓았다.

참고 문서: http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp

 

이외 자바 프로시저 관련해서 발생하는 오류에 대해 잘 정리가 된 문서가 있어 소개해 본다.

(자바 프로시저를 생성하고, 실행해볼 수 있도록 설명이 되었기에 자바 프로시저에 대한 기능 테스트 하기 편할 것 같다.)

참고 문서: http://www.ibm.com/developerworks/data/library/techarticle/dm-0510law/

+ Recent posts