쓰고자 하는 내용이 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 FMP Process:
명령어: db2pd -fmpe pid=950308 genquery 결과: FMP Process: WITH RTNHIST ( PID, TID, RTNID, RTNTIME) AS |
특정 PID에 대해 어떤 SQL이 실행되었는지를 위와 같은 명령어를 통해서 확인할 수 있다.
만일 특정 루틴이 이런 문제를 발생했다면, 위와 같은 방식으로 찾아 낼 수 있지 않을까 하는 생각을 한다.
정보센터에도 자세한 내용은 나오지 않지만 flags에 대해서는 자세히 기술해 놓았다.
참고 문서: http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp
이외 자바 프로시저 관련해서 발생하는 오류에 대해 잘 정리가 된 문서가 있어 소개해 본다.
(자바 프로시저를 생성하고, 실행해볼 수 있도록 설명이 되었기에 자바 프로시저에 대한 기능 테스트 하기 편할 것 같다.)
참고 문서: http://www.ibm.com/developerworks/data/library/techarticle/dm-0510law/
'Note' 카테고리의 다른 글
[관리] DB2 V9.7에서 TSAMP 버전 확인 방법 (0) | 2011.09.23 |
---|---|
[개발] DB2 데이터의 export 의 modified by 옵션 (0) | 2011.09.19 |
[관리] 불필요한 DB2 프로세스 죽이기 (0) | 2011.09.05 |
[설치] DB2 모듈을 설치 무심코 넘어가는 실수 Instance start 시 나는 에러 (0) | 2011.09.05 |
[운영] DB2 Import , Load 시 GENERATE 값 인식 시키기 (1) | 2011.08.25 |