Fork Coding
Papers/서버리스 인스턴스 동결과 Postgres 풀러 클라이언트 슬롯 고갈: Next.js·Supabase 운영 사례와 로컬 재현
인프라·운영·2026년 10월

서버리스 인스턴스 동결과 Postgres 풀러 클라이언트 슬롯 고갈: Next.js·Supabase 운영 사례와 로컬 재현

ServerlessConnection PoolPostgreSQLTransaction PoolerIncident Analysis

Abstract

서버리스 함수는 응답 뒤 실행 환경이 얼어붙는다. 이때 앱이 트랜잭션 풀러에 연 커넥션이 어떻게 남는지는 잘 드러나지 않는다. 이 논문은 Next.js·Vercel·Supabase로 만든 사내 도구 zenith에서 2026년 7–9월에 반복된 커넥션 장애를 장애 기록 11건과 커밋 16건으로 재구성하고, 원인을 네 기제로 나눈다. 핵심 장애는 풀러 클라이언트 슬롯 200개의 고갈이었고, 풀 상한을 10에서 4로 낮춘 뒤에도 재발했다. 동결된 인스턴스에서는 유휴 타이머가 실행되지 않으므로, 점유가 요청을 한 번이라도 처리한 인스턴스 수 W에 비례한다는 모형 W·min(q, m)을 세웠다. 프로세스 정지 신호로 동결을, TCP 프록시로 슬롯 상한 40을 흉내 낸 재현 실험에서 타이머에만 맡긴 두 구성의 최대 점유는 모든 조건에서 min(W·min(q, m), 40)과 같았고, 실패 인스턴스는 상한 4에서 W = 16일 때 6개였다. 풀 전체가 조용해진 뒤 소켓을 닫는 반납 구성은 인스턴스를 8개에서 16개로 늘려도 최대 점유가 32–36개로 상한 40 아래였고 실패가 없었다. 그 대가로 성공 요청의 지연 중앙값이 2.6–8.7 ms 늘었다. 동결이 유휴 타이머보다 짧고 그동안 소켓이 끊긴 경우에는 세 방어 구성 중 쿼리 전 풀 교체만이 첫 요청과 재시도를 모두 성공시켰다.

주요 기여

결론

응답 직후 얼어붙는 서버리스 인스턴스에서 타이머 기반 정리와 풀 상한은 풀러 클라이언트 슬롯의 점유를 제한하지 못했다. 재현 실험에서 점유는 min(W·min(q, m), L)을 따랐고, 상한을 낮추면 고갈 시점만 늦춰졌다. 풀 전체가 조용해진 뒤 소켓을 닫는 반납은 인스턴스를 8개에서 16개로 늘려도 최대 점유를 32–36개로 유지했다. 그 대가는 요청당 연결 수립(루프백에서 p50 2.6–8.7 ms 증가)과 반납 대기 시간이다. 죽은 소켓 hang에는 쿼리 전 풀 교체가 첫 요청과 재시도를 모두 살렸다. 후속 과제는 실제 플랫폼에서 동결 중 타이머 동작을 확인하는 일과 반납 대기의 비용을 측정하는 일이다.

–

댓글 0

댓글을 불러오는 중…