본문으로 건너뛰기

5.1 TCP 연결과 queue

PostgreSQL connection은 client의 connect, TCP handshake, TLS, authentication, backend 생성 순서를 거칩니다. 연결 시간이 길다면 query 실행 전 단계부터 분리합니다.

ss -s
ss -lnt '( sport = :5432 )'
ss -ntp '( sport = :5432 or dport = :5432 )'

Listening socket의 Recv-Q는 처리되지 않은 connection backlog를 나타낼 수 있고, established socket에서는 application이 읽지 않은 byte를 뜻합니다. 같은 열 이름이라도 socket 상태에 따라 의미가 다릅니다.

Queue가 생기는 위치

Connection storm에서는 accept queue, PostgreSQL max_connections, authentication CPU가 동시에 영향을 받을 수 있습니다. Pooler가 있으면 client queue와 pool-to-database connection을 분리합니다.

SELECT state, wait_event_type, wait_event, count(*)
FROM pg_stat_activity
GROUP BY 1, 2, 3
ORDER BY 4 DESC;

Socket queue가 커졌지만 backend는 ClientRead를 기다린다면 client가 다음 요청을 보내지 않는 idle connection일 수 있습니다. ClientWrite가 많으면 client가 result를 충분히 빨리 읽는지와 network path를 확인합니다.