PostgreSQL 커넥션 풀 설정 정리
트래픽이 몰릴 때마다 too many clients already 에러가 나서 원인을 찾아봤더니, 커넥션 풀 설정을 기본값 그대로 쓰고 있었다.
기본 설정의 문제
pg 라이브러리의 Pool 기본 max 값이 생각보다 낮게 잡혀있어서, 동시 요청이 몰리면 커넥션을 얻기 위해 대기하다 타임아웃이 나는 경우가 많았다.
const { Pool } = require("pg");
const pool = new Pool({
host: process.env.DB_HOST,
max: 20,
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 5000,
});
튜닝 포인트
max는 DB 서버가 감당 가능한 동시 커넥션 수를 고려해서 정해야 한다는 걸 깨달았다. 무작정 늘린다고 좋은 게 아니라, DB 자체의 max_connections 한도와 다른 서비스들이 쓰는 커넥션 수까지 감안해야 했다.
idleTimeoutMillis는 유휴 커넥션을 얼마나 오래 붙잡고 있을지 정하는 값인데, 너무 짧으면 재연결 비용이 계속 발생하고 너무 길면 불필요하게 커넥션을 점유하게 된다.
결과
값을 조정하고 나서 피크 시간대 에러가 확실히 줄었다. 다음엔 PgBouncer 같은 외부 커넥션 풀러 도입도 고려해볼 생각이다.