본문 바로가기

소프트웨어-이야기/데이터 저장소 + 시각화

(PostgreSQL)Idle in transaction 프로세스 자동으로 죽이기

문제 상황

postgresql에서 transaction이 잡혀있지만, 아무것도 하지 않으면, 세션의 상태는 idle in transaction이 된다.


그런데 얘가 connection은 쥐고 있지만, 아무것도 안한다면 서버 자원을 잘 활용하지 못하게 된다. ( 참고 - (Django)PostgreSQL의 Idle In Transaction Connection )

그러면 connection이 무한대로 늘어난다거나, connection이 필요한애가 DB를 제대로 활용하지 못하게 될 수 있다.


해결 방법

postgresql에는 Idle in transaction이 일정 기간동안 유지되면 자동으로 이 transaction을 죽여주는 기능이 있다. 


idle_in_transaction_session_timeout 옵션을 설정하면 된다.

이 값이 0으로 설정되어있으면, 이 기능을 사용하지 않는다는걸 의미한다. 


근본적으로는 오래동안 유지되는 idle in transaction이 발생하지 않도록 하는게 중요하겠지만, 

이 옵션을 사용하면 커넥션이 무한정 늘어나는 최악의 상황은 막을 수 있다.


예시

어떤식으로 동작하는지 예제는 아래의 글을 참고하면 된다. 

참고 - A look at PostgreSQL 9.6 – Killing idle transactions automatically - Blog dbi services