Blog >> PHP >> Whitepapers.

PHP 풀별 pm.max_children 적정 한도를 산출 150 150 phobe

PHP 풀별 pm.max_children 적정 한도를 산출

현재 풀별 메모리 분석

ps -eo rss,args | grep -E "php-fpm: pool" | grep -v grep | awk '{
    pool = $NF;
    rss = $1;
    mem[pool] += rss;
    count[pool] += 1;
}
END {
    printf "%-25s %-10s %-15s %-15s\n", "Pool Name", "Workers", "Avg Mem (MB)", "Total Mem (MB)";
    printf "----------------------------------------------------------------------\n";
    for (p in count) {
        printf "%-25s %-10d %-15.2f %-15.2f\n", p, count[p], (mem[p] / count[p]) / 1024, mem[p] / 1024;
    }
}'

적정 메모리 계산 공식:
적정 max_children = 풀에 할당할 최대 가용 RAM (MB) / Avg Mem (MB)
각 풀의 pm.max_children은 트래픽 폭증 시 워커가 최대로 늘어나더라도 서버 전체 가용 RAM을 넘지 않도록 상한선을 제한하는 안전장치

서버 전체 메모리(free -h) 결과를 확인해 각 풀별 적정 max_children 값을 정해봄.
총 RAM 64GB 중 데이터베이스 자원으로 50% 정도를 계산하고 10개의 풀을 기준으로 계산.
총 RAM 62GB에서 DB 자원으로 50%(약 31GB)를 할당하고,
OS 및 웹서버(Nginx/Apache), 시스템 버퍼 캐시로 약 11GB를 배분하면,
PHP-FPM에 배정할 수 있는 순수 메모리는 약 20GB(20,480MB).

# 1순위 풀 (3/10) : 순간적인 트래픽 폭증에 지연 없이 대응하도록 예비 프로세스를 넉넉히 유지
pm = dynamic
pm.max_children = 40
pm.start_servers = 8
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 1000

# 2순위 풀 (4/10) : 평상시 자원 낭비를 줄이면서 트래픽 유입 시 최대 22개까지 유연하게 확장
pm = dynamic
pm.max_children = 22
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 8
pm.max_requests = 1000

# 3순위 풀 (3/10) : 기본 상주 프로세스를 최소화하여 평상시 RAM을 1·2순위 및 DB에 양보
pm = dynamic
pm.max_children = 15
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 1000

평상시 vs 트래픽 피크 시 메모리 점유 시뮬레이션
평상시 점유량 (초기 구동 상태)1순위(8개 × 3) + 2순위(5개 × 4) + 3순위(3개 × 3) = 총 53개 워커 예상
평상시 메모리: 53x80MB ~ 약 4.2 GB (유휴 메모리 약 16GB 확보)

모든 사이트 동시 피크 시최대 워커 수 253개 도달 시에도
약 20.2GB에 고정되어 DB(31GB)와 OS 영역(11GB)을 전혀 침범하지 않고 안전하게 방어.