From 08a9c5208857fda1a0f920fda1560544419b63f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AF=BC=ED=97=8C?= Date: Fri, 10 Jul 2026 08:35:48 +0900 Subject: [PATCH] =?UTF-8?q?docs(lps):=20=EC=95=84=ED=82=A4=ED=85=8D?= =?UTF-8?q?=EC=B2=98=EC=97=90=20API=20=EB=A9=80=ED=8B=B0=EC=BD=94=EC=96=B4?= =?UTF-8?q?=20=EC=8A=A4=EC=BC=80=EC=9D=BC=C2=B7=EC=BB=A4=EB=84=A5=EC=85=98?= =?UTF-8?q?=20=ED=92=80=20=EC=9E=90=EB=8F=99=EC=82=B0=EC=A0=95(6-1)=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit process_count 를 늘릴 때 풀 오버서브스크립션→커넥션 고갈 함정과 connection_budget 기반 자동 역산 해법을 문서화. Co-Authored-By: Claude Opus 4.8 --- lps/docs/architecture.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lps/docs/architecture.md b/lps/docs/architecture.md index 1f80650..79ecc6e 100644 --- a/lps/docs/architecture.md +++ b/lps/docs/architecture.md @@ -95,7 +95,15 @@ - `POST /search`에 상품 리스트를 주면 상품마다 잡을 큐에 적재. - 워커 동시성(`WORKER_CONCURRENCY=N`)만큼 상품을 **진짜 병렬** 처리 — 워커마다 **자기 브라우저 세트**(프로필 분리 + 다른 프록시 IP)를 가져 공유 lock 병목을 없앰. 권장 N=2~3(로컬, Chrome 최대 4×N개). -- 부하 측정: `loadtest.py`(처리량·p50/p95 지연·AI/DECODO/총비용 집계). +- 부하 측정: `loadtest.py`(e2e 처리량·p50/p95 지연·AI/DECODO/총비용) · `loadtest/`(Locust API 부하, 멀티코어 벤치). + +### 6-1. API 멀티코어 스케일 & 커넥션 풀 자동산정 + +- **API 서버는 asyncio(스레드 1개) = 1 프로세스 1 코어**. 처리량을 코어만큼 올리려면 `process_count`(uvicorn 워커 수)를 늘린다. +- **함정**: 프로세스마다 독립 커넥션 풀을 열어 `(pool_size + max_overflow) × 2엔진(R/W) × process_count` 만큼 커넥션을 요구 → PG `max_connections`(기본 100)를 넘으면 **커넥션 고갈로 요청 실패 폭증**(부하테스트로 실증: 풀 10/20 · 4프로세스 = 240 요구 → 실패 1만+). +- **해결(자동)**: `MainDBConfig.connection_budget`(기본 40)를 두면 기동 시 `process_count`에 맞춰 `pool_size/max_overflow`를 **역산**해 `(pool+overflow)×2×process_count ≤ budget`을 스스로 보장(`server_configs._autosize_pool`). 워커를 늘려도 예산을 넘지 않는다. 기동 로그 `DB Pool : … = N conns (budget=…)`로 실효값 확인. +- **예산 가이드**: 공유 PG=40(API+worker+타 서비스 공존, 안정 우선) / 전용 PG(`max_connections≈100`)=90(처리량 우선). env `DB_CONNECTION_BUDGET`. 더 큰 처리량은 예산↑ + PG `max_connections`↑ 또는 pgbouncer. +- 상세·벤치 결과: [`../loadtest/README.md`](../loadtest/README.md). ## 7. 최저가 이력 (그래프)