20140312

PHP-FPM pm.dynamic vs pm.ondemand

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 뽑힘.

댓글 없음: