php-fpm pool.d 설정 손봤다. pm 모드 세 개 (static/dynamic/ondemand) 중에 뭐 쓸지 매번 고민되는데, 이번에 한번 정리함.
static — 항상 N개 띄워둠. 메모리 낭비지만 예측 가능. 대형 트래픽엔 이게 속편함.
dynamic — min/max 사이에서 유지. spare 기준으로 늘리고 줄임. 대부분은 이거로 충분.
ondemand — 요청 들어올 때만 fork. 거의 안쓰는 서비스에 유리. idle_timeout 지나면 죽음.
우리 api서버 (트래픽 꾸준) 쪽은 dynamic 유지:
pm = dynamic pm.max_children = 40 pm.start_servers = 8 pm.min_spare_servers = 4 pm.max_spare_servers = 12 pm.max_requests = 500
max_children는 (서버 메모리 - OS/DB) / 프로세스당 평균 메모리로 계산. ps aux로 보니 프로세스 하나당 40MB쯤. 4GB 머신에 opcache 128 빼고 하면 대충 40~50 나옴. 여유롭게 40.
max_requests=500 설정은 메모리 누수 대비. fpm 워커가 500 요청 처리하고 자살 → 재포크. 누수 있는 라이브러리 쓸 때 생명줄임.
관리자 페이지처럼 사용자 2~3명 뿐인 서비스는 ondemand로 깔아둠. idle_timeout 10초. 메모리 훨씬 아낌.
pm = ondemand pm.max_children = 10 pm.process_idle_timeout = 10s
모니터링은 ping.path 설정해두고 nginx status랑 같이 수집. slowlog도 꼭 켜둘것. 5초 이상 걸리는 요청 stack trace 뽑힘.