connection_budget(기본 40)을 두고, 기동 시 process_count 에 맞춰 pool_size/max_overflow 를 역산: (pool+overflow)×2엔진×process_count ≤ budget. 워커를 늘려도 config 가 스스로 예산을 지켜 커넥션 고갈→요청 실패를 예방. - config_models: MainDBConfig.connection_budget 추가 - server_configs: _autosize_pool(process_count 확정 후 산정) + _apply_pool_env_override (우선순위 = 명시 DB_POOL_SIZE > 자동 산정 > toml pool) - web_main: 기동 로그에 실효 풀/총커넥션/예산 출력 - env: DB_CONNECTION_BUDGET override, docker-compose 에 knob 노출 - tests: test_pool_autosize 10케이스(예산 준수·분할비·비활성·infeasible 바닥) - docs: operations 2-1 멀티코어/풀 섹션 + loadtest README 자동산정 표 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
47 lines
1.7 KiB
Python
47 lines
1.7 KiB
Python
# 실행 방법
|
||
# pip install -r requirements.txt
|
||
# python web_main.py # 기본 local 환경
|
||
# APP_ENV=dev python web_main.py # 환경 지정
|
||
#
|
||
# 또는 uvicorn 직접 실행:
|
||
# uvicorn router.router:app --reload --host=0.0.0.0 --port=9600
|
||
|
||
import uvicorn
|
||
|
||
from common.logger import LOG
|
||
from config.server_configs import web_server_config, main_db_config
|
||
|
||
LOG.SetPrefix(web_server_config.server_name)
|
||
|
||
# import 시점에 app 및 DB 세션 매니저(싱글톤)가 초기화된다.
|
||
import router.router
|
||
|
||
if __name__ == "__main__":
|
||
LOG.i(f"Server Name : {web_server_config.server_name}")
|
||
LOG.i(f"Server Port : {web_server_config.port}")
|
||
LOG.i(f"API Server start time : {router.router.API_SERVER_START_TIME}")
|
||
# 실효 커넥션 풀(자동 산정 결과) — 멀티워커 시 커넥션 예산 준수 여부 확인용.
|
||
_pc = web_server_config.process_count
|
||
_conn = (main_db_config.pool_size + main_db_config.max_overflow) * 2 * _pc
|
||
LOG.i(f"DB Pool : pool_size={main_db_config.pool_size} max_overflow={main_db_config.max_overflow} "
|
||
f"× 2engine × {_pc}workers = {_conn} conns (budget={main_db_config.connection_budget})")
|
||
|
||
if web_server_config.is_ssl:
|
||
uvicorn.run(
|
||
"router.router:app",
|
||
host="0.0.0.0",
|
||
port=web_server_config.port,
|
||
access_log=False,
|
||
workers=web_server_config.process_count,
|
||
ssl_keyfile="./SSL/key.pem",
|
||
ssl_certfile="./SSL/cert.pem",
|
||
)
|
||
else:
|
||
uvicorn.run(
|
||
"router.router:app",
|
||
host="0.0.0.0",
|
||
port=web_server_config.port,
|
||
access_log=False,
|
||
workers=web_server_config.process_count,
|
||
)
|