현재 jdbc를 사용해서 프로그램에서 truncate/select/insert 순서로 각각의 트랜잭션으로 수행하는 로직이 있습니다.
커넥션 하나에서 아래 순서로 처리가 되고 이런 커넥션이 20개가 되지 않습니다. (각세션마다 다른 테이블작업임)
begin --> truncate --> end --> begin --> select --> end --> begin --> insert --> end;
한참 잘 돌다가 약 5~10분 쯤되면 갑자기 한 두개 select 트랜잭션이 시작되자마자 변경없이 active 상태로 몇시간동안 머물고 있습니다.
실제론 lock 발생도 아니고, 해당 select 쿼리가 오래걸리는 작업도 아닙니다. (이 문제가 발생할 때 같은 쿼리를 돌려보면 0.3초정도 걸리는 쿼리입니다.)
테이블 사이즈도 100MB 미만인데 해당 프로세스가 cpu 100%를 물고 있는 상태로 처리되지 않고 머물러 있습니다
DB로그에도 남지않고, 프로그램 로그에도 이상로그가 없는데 도대체 뭐가 문제인지 확인이 어렵습니다.
(debug5 까지 돌려보아도 특별한 로그가 없습니다.)
이 문제는 발생시간이 일정하지도 않고 항상 발생하는 것도 아닙니다. (10번 중 3번정도 발생)
네트워크쪽 timeout인가 싶어서 15분 --> 60분으로 늘려봤지만 문제 현상은 여전히 발생합니다.
ulimit 값도 충분하다고 생각됩니다..
[postgres@localhost ~]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 512693
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 86000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
딱 한번 걸렸던 세션이 자동 처리된 적이 있었는데
그때 아래 로그가 확인되기는 했습니다. 그치만.. 구글링 해봐도 소스내용밖에 나오지 않네요
ProcessCatchupEvent outside transaction
cache state reset
sinval catchup complete, cleaning queue
의심해볼만한 부분이 뭐가 있을까요?
|