본문 바로가기

PHP FPM 워커 프로세스 수, 이젠 헷갈리지 마세요




PHP FPM 기본 설정과 워커 프로세스의 이해

PHP FPM(FastCGI Process Manager)은 PHP 애플리케이션의 성능을 최적화하는 데 중요한 역할을 합니다. 특히 워커 프로세스(worker process)는 PHP 스크립트를 실제로 실행하는 독립적인 프로세스를 의미합니다. 이 워커 프로세스의 수를 어떻게 설정하느냐에 따라 서버의 응답 속도와 안정성이 크게 달라질 수 있습니다. PHP FPM은 스태틱(static), 동적(dynamic), 온디맨드(ondemand) 세 가지 런타임 비하이브(runtime behavior) 설정을 통해 워커 프로세스 관리를 지원하며, 각 설정 방식은 고유한 장단점을 가집니다. 최적의 설정을 위해서는 이러한 기본 개념을 정확히 이해하는 것이 필수적입니다. 워커 프로세스의 개념을 확실히 잡는 것이 첫걸음입니다.

다음은 PHP FPM의 세 가지 주요 런타임 비하이브 설정을 비교한 표입니다. 이 표를 통해 각 설정 방식의 특징과 용도를 명확히 이해할 수 있습니다.

 

설정 방식 주요 특징 장점 단점
Static 시작 시 미리 지정된 수의 워커 프로세스 생성 일정한 성능 유지, 예측 가능 최악의 경우 리소스 낭비
Dynamic 요청 수에 따라 워커 프로세스 수를 동적으로 조절 리소스 효율성 증대 프로세스 생성/종료 오버헤드 발생
Ondemand 요청이 있을 때만 워커 프로세스 생성, 유휴 시 종료 최대한의 리소스 절약 초기 응답 지연 가능성

PHP FPM 워커 프로세스 수, 이젠 헷갈리지 마세요




최적의 워커 프로세스 수 조절 전략

PHP FPM 워커 프로세스 수를 결정하는 것은 단순한 숫자 놀이가 아닙니다. 서버의 CPU 코어 수, 메모리 용량, 그리고 웹사이트의 트래픽 패턴을 종합적으로 고려해야 합니다. 일반적으로 CPU 코어 수에 기반하여 최대 동시 요청 수를 처리할 수 있도록 설정하는 것이 권장됩니다. 하지만 무조건 코어 수보다 많이 늘린다고 해서 성능이 향상되는 것은 아닙니다. 오히려 지나치게 많은 워커 프로세스는 컨텍스트 스위칭 비용을 증가시키고 메모리 부족을 야기하여 서버 성능을 저하시킬 수 있습니다. 성능 저하의 주요 원인 중 하나가 잘못된 프로세스 수 설정일 수 있습니다.

가장 흔하게 사용되는 공식은 (CPU 코어 수 * 2) + 1 입니다. 이 공식은 일반적인 웹 애플리케이션에서 효과적인 성능을 보여주는 경향이 있지만, 애플리케이션의 특성(CPU 바운드인지, I/O 바운드인지)에 따라 달라질 수 있습니다. 따라서 이 공식은 시작점으로 삼고, 실제 서버의 모니터링 결과를 바탕으로 점진적으로 조절해나가야 합니다.

 

핵심 포인트: 서버 사양과 트래픽 패턴을 분석하여 최적의 워커 프로세스 수를 설정하고, 주기적인 모니터링을 통해 미세 조정을 수행하는 것이 중요합니다.

PHP FPM 워커 프로세스 수, 이젠 헷갈리지 마세요




워커 프로세스 설정 값 이해 및 조정 방법

PHP FPM 설정 파일(일반적으로 `php-fpm.conf` 또는 `pool.d/www.conf`)에는 워커 프로세스 수를 제어하는 몇 가지 중요한 지시어들이 있습니다. `pm.max_children`, `pm.start_servers`, `pm.min_spare_servers`, `pm.max_spare_servers` 등이 그것입니다. `pm.max_children`은 PHP FPM이 생성할 수 있는 최대 워커 프로세스 수를 의미하며, 이것이 전체 워커 프로세스 수의 상한선을 결정합니다. `pm.start_servers`는 PHP FPM 시작 시 생성되는 워커 프로세스 수이며, `pm.min_spare_servers`와 `pm.max_spare_servers`는 유휴 상태의 워커 프로세스 수를 조절하여 요청이 몰렸을 때 빠르게 대응할 수 있도록 합니다. 설정 값을 이해하는 것이 문제 해결의 시작입니다.

이 값들을 조정할 때는 각 설정이 시스템에 미치는 영향을 충분히 이해해야 합니다. 예를 들어, `pm.max_children` 값을 너무 높게 설정하면 서버 메모리가 부족해져 시스템 전체가 느려지거나 멈출 수 있습니다. 반대로 너무 낮게 설정하면 동시 요청 처리가 불가능해져 응답 시간이 길어지고 사용자 경험이 나빠집니다. 따라서 단계적으로 값을 올리거나 내리면서 서버 모니터링 도구를 통해 CPU 사용률, 메모리 사용률, 응답 시간 등을 주의 깊게 관찰하며 최적점을 찾아야 합니다.

 

▶ 1단계: 현재 서버 사양(CPU 코어, RAM)과 평균/최대 트래픽을 파악합니다.

▶ 2단계: `php-fpm.conf` 또는 `pool.d/www.conf` 파일에서 `pm.max_children` 값을 시스템 메모리의 80% 정도를 사용하지 않도록 보수적으로 설정합니다. (예: 1024MB RAM 서버의 경우, 각 워커 프로세스가 20MB를 사용한다면 40개 정도로 설정)

▶ 3단계: `pm.start_servers`, `pm.min_spare_servers`, `pm.max_spare_servers` 값을 적절히 설정하여 유휴 프로세스 수를 관리합니다. 일반적으로 `pm.start_servers`는 `pm.min_spare_servers`와 `pm.max_spare_servers`의 중간 값으로 설정하는 것이 좋습니다.

▶ 4단계: PHP FPM 서비스를 재시작하고, 웹사이트 트래픽이 몰리는 시간대에 서버의 CPU, 메모리 사용률, 그리고 PHP 스크립트의 응답 시간을 모니터링합니다.

▶ 5단계: 모니터링 결과를 바탕으로 `pm.max_children` 값을 점진적으로 조절하며 최적의 성능을 찾습니다. 성능 저하가 발생하면 값을 낮추고, 여유가 있다면 조금씩 높여봅니다.




최적의 워커 프로세스 수 설정 방법

PHP FPM의 워커 프로세스 수는 웹 애플리케이션의 성능에 지대한 영향을 미칩니다. 너무 적으면 동시 접속자 처리에 병목 현상이 발생하고, 너무 많으면 시스템 자원을 과도하게 사용하여 오히려 성능 저하를 초래할 수 있습니다. 그렇다면 우리 서버 환경에 맞는 최적의 워커 프로세스 수는 어떻게 설정해야 할까요? 단순히 경험에 의존하기보다는 몇 가지 기준을 가지고 접근하는 것이 중요합니다. 먼저, 서버의 CPU 코어 수를 고려해야 합니다. 일반적으로 CPU 코어 수의 1~4배 정도로 설정하는 것이 권장됩니다. 또한, 애플리케이션의 특성을 파악하는 것이 중요합니다. CPU 집약적인 작업이 많다면 CPU 코어 수에 근접하게 설정하고, I/O 작업이 많다면 약간 더 여유롭게 설정할 수 있습니다. 메모리 사용량 또한 중요한 고려사항입니다. 각 워커 프로세스는 일정량의 메모리를 사용하므로, 시스템 메모리 용량을 초과하지 않도록 주의해야 합니다. 워커 프로세스 수 설정은 단 한 번으로 끝나는 것이 아니라, 실제 운영 환경에서의 모니터링을 통해 지속적으로 튜닝해야 하는 과정입니다.

 

고려사항 설명
CPU 코어 수 CPU 코어 수의 1~4배 설정 고려
애플리케이션 특성 CPU 집약적 vs I/O 집약적
메모리 용량 전체 시스템 메모리 용량 초과 금지
모니터링 및 튜닝 지속적인 성능 분석 기반 조정




PHP FPM 설정 파일과 워커 관리

PHP FPM의 동작 방식을 이해하려면 설정 파일을 제대로 알아야 합니다. 주요 설정 파일인 `php-fpm.conf` 또는 각 풀(pool)별 설정 파일(예: `www.conf`)에서 워커 프로세스 관련 설정을 조정할 수 있습니다. 이 파일들에는 `pm` (Process Manager) 설정, `pm.max_children`, `pm.start_servers`, `pm.min_spare_servers`, `pm.max_spare_servers` 등 워커 프로세스의 생명 주기를 관리하는 다양한 옵션들이 포함되어 있습니다. `pm` 옵션은 `static`, `dynamic`, `ondemand`와 같이 워커 프로세스를 관리하는 방식을 지정합니다. `static` 모드는 미리 지정된 수만큼 프로세스를 유지하며, `dynamic` 모드는 시스템 부하에 따라 프로세스 수를 동적으로 조절합니다. `ondemand` 모드는 요청이 있을 때만 프로세스를 생성하고, 사용하지 않을 때는 종료하여 메모리 효율을 높이는 방식입니다. 각 설정의 의미를 정확히 파악하고, 서버 환경과 워크로드에 맞게 조절하는 것이 중요합니다. 예를 들어, `pm.max_children` 값은 동시에 실행될 수 있는 최대 워커 프로세스 수를 제한하여 과부하를 방지하는 역할을 합니다.

 

▶ pm.max_children: 동시에 실행 가능한 최대 워커 프로세스 수. 시스템 리소스와 메모리 사용량을 고려하여 설정해야 합니다. 너무 높게 설정하면 서버 다운으로 이어질 수 있습니다.

▶ pm.start_servers: PHP-FPM이 시작될 때 생성되는 초기 워커 프로세스 수.

▶ pm.min_spare_servers: 프로세스 부족으로 인한 성능 저하를 방지하기 위해 유지하는 최소한의 유휴 워커 프로세스 수.

▶ pm.max_spare_servers: 최대 워커 프로세스 수에 도달하기 전에 유지할 수 있는 최대 유휴 워커 프로세스 수. 과도한 메모리 사용을 방지합니다.

핵심 요약

• PHP FPM 워커 프로세스 수는 서버 성능과 직결되므로 신중하게 설정해야 합니다.
• CPU 코어 수, 애플리케이션 특성, 메모리 용량을 종합적으로 고려하여 최적의 값을 찾아야 합니다.
• `php-fpm.conf` 또는 `www.conf` 파일에서 `pm`, `max_children` 등의 설정을 통해 워커 프로세스를 관리합니다.
• 지속적인 모니터링과 튜닝을 통해 최적의 성능을 유지하는 것이 중요합니다.




주요 질문 FAQ




Q. PHP FPM 워커 프로세스 수는 어떻게 설정해야 성능이 가장 좋아지나요?

최적의 워커 프로세스 수는 서버의 CPU 코어 수, 메모리 용량, 그리고 애플리케이션의 특성에 따라 달라집니다. 일반적으로 'dynamic' 또는 'ondemand' 방식보다는 'static' 방식을 사용하여 CPU 코어 수에 맞춰 설정하는 것이 안정적인 성능을 보장하는 경우가 많습니다. 예를 들어, 8코어 CPU라면 8개에서 1.5배 정도인 12개 정도로 시작하여 실제 부하 테스트를 통해 조절하는 것이 좋습니다. 과도하게 늘리면 컨텍스트 스위칭 오버헤드가 발생할 수 있으니 주의해야 합니다.




Q. PHP FPM 설정 파일(php-fpm.conf 또는 pool.d/*.conf)에서 어떤 파라미터를 봐야 하나요?

가장 중요하게 봐야 할 파라미터는 `pm` (Process Manager), `pm.max_children`, `pm.start_servers`, `pm.min_spare_servers`, `pm.max_spare_servers`, 그리고 `pm.process_idle_timeout` 입니다. `pm`은 워커 프로세스 관리 방식을, `pm.max_children`은 최대 생성 가능한 워커 수를 결정합니다. 나머지 `pm.start_servers` 등은 워커의 동적인 관리 범위를 설정하며, `pm.process_idle_timeout`은 유휴 상태 워커를 종료하는 시간을 설정합니다.




Q. 'dynamic'과 'static' 워커 관리 방식 중 어떤 것을 선택해야 할까요?

'static' 방식은 지정된 수의 워커 프로세스를 항상 유지하므로, 예상 트래픽이 꾸준하거나 급격한 트래픽 변동이 적을 때 안정적인 응답 속도를 기대할 수 있습니다. 반면 'dynamic' 방식은 부하에 따라 워커 수를 조절하여 메모리 사용량을 효율적으로 관리할 수 있습니다. 트래픽 변동이 크거나 메모리 제약이 심한 환경에서는 'dynamic'이 유리할 수 있으나, 최적화 설정이 까다로울 수 있습니다. 대부분의 경우, 안정성과 예측 가능성 때문에 'static' 방식을 선호합니다.




Q. 워커 프로세스 수를 너무 많이 늘리면 어떤 문제가 발생하나요?

워커 프로세스 수를 시스템 자원(CPU, 메모리)의 한계를 넘어서까지 너무 많이 늘리면, 여러 프로세스가 CPU 시간을 얻기 위해 경쟁하면서 발생하는 '컨텍스트 스위칭' 오버헤드가 커집니다. 이는 오히려 실제 작업 처리 시간을 줄이고 시스템 전반의 응답 속도를 저하시킬 수 있습니다. 또한, 각 워커 프로세스가 사용하는 메모리량이 누적되어 서버 메모리가 부족해지는 '메모리 누수' 현상이나 OOM(Out Of Memory) 킬러에 의해 프로세스가 강제 종료되는 상황을 초래할 수 있습니다.




Q. PHP FPM 설정 변경 후 적용하는 올바른 방법은 무엇인가요?

PHP FPM 설정 파일을 수정한 후에는 PHP FPM 서비스를 재시작하거나 리로드해야 변경 사항이 적용됩니다. 일반적으로 `sudo systemctl restart php-fpm` 또는 `sudo systemctl reload php-fpm` 명령어를 사용합니다. 설정 파일 경로가 다를 경우 해당 경로에 맞게 명령어를 수정해야 합니다. 변경 후에는 PHP FPM 프로세스가 올바르게 실행되는지, 오류 로그는 없는지 확인하는 것이 중요합니다.




Q. 특정 PHP FPM 풀(pool)에 대해서만 워커 프로세스 수를 다르게 설정할 수 있나요?

네, 가능합니다. PHP FPM은 여러 개의 풀(pool)을 사용하여 다른 애플리케이션이나 사이트에 대해 독립적인 설정을 적용할 수 있습니다. 각 풀은 별도의 설정 파일(일반적으로 `/etc/php-fpm.d/pool_name.conf`와 같은 형태)을 가지며, 이 파일 내에서 `pm.max_children`과 같은 워커 관련 파라미터를 해당 풀에 맞게 개별적으로 설정할 수 있습니다. 이를 통해 각기 다른 부하 특성을 가진 서비스에 최적화된 설정을 할 수 있습니다.




Q. 부하 테스트를 통해 PHP FPM 워커 수를 최적화하는 구체적인 방법은 무엇인가요?

먼저, 현재 서버 환경에서 워커 수를 CPU 코어 수에 맞춰 'static'으로 설정하고, PHP FPM 로그 및 시스템 모니터링 도구(top, htop, sar 등)를 통해 CPU 사용량, 메모리 사용량, 현재 실행 중인 PHP FPM 프로세스 수를 확인합니다. ApacheBench (ab) 또는 k6와 같은 도구를 사용하여 실제 요청과 유사한 부하를 생성하면서 워커 수를 점진적으로 늘리거나 줄여가며 응답 시간(average response time), 처리량(requests per second), 에러 발생률 등을 측정합니다. CPU 사용량이 80-90% 수준이고 응답 시간이 만족스러우며 에러가 발생하지 않는 지점을 찾는 것이 일반적인 최적화 목표입니다.




Q. 'ondemand' 방식은 어떤 경우에 유리하며, 설정 시 주의할 점은 무엇인가요?

'ondemand' 방식은 요청이 없을 때는 워커 프로세스를 0으로 줄였다가, 요청이 들어오면 `pm.max_children`까지 워커를 동적으로 생성하는 방식입니다. 메모리 사용량을 최소화해야 하는 환경이나, 트래픽이 매우 간헐적이고 예측 불가능한 경우에 유용합니다. 하지만, 워커가 새로 생성될 때마다 초기화 시간이 소요되므로, 짧은 시간 안에 많은 요청이 몰리는 경우 초기 응답 속도가 느려질 수 있습니다. `pm.max_children`을 너무 높게 설정하면 갑작스러운 트래픽 폭증 시 메모리 부족으로 시스템이 불안정해질 위험이 있습니다.

문공돌이 코지의 it 이야기
@문공돌이 코지의 it 이야기

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차