설치 대상 : Apache Worker 또는 Prefork? 각각의 (단점)은 무엇입니까?


55

PreforkWorker MPM 에 대한 설명에 따르면 prefork 유형이 다소 구식이지만 두 유형을 제대로 비교할 수는 없습니다.

내가 알고 싶은 것 :

  • 두 버전의 차이점은 무엇입니까?
  • 각 서버 유형의 장점은 무엇입니까?
  • 조건에 따라 선택할 유형에 대한 기본 지침이 있습니까?
  • 둘 사이에 큰 성능 차이가 있습니까?

답변:


40

문서가 말했듯이 스레드가 안전하지 않은 라이브러리와의 호환성을 위해 스레딩을 피해야하는 경우 프리 포크 MPM을 사용해야합니다. 일반적으로 사소한 아파치 모듈 ( mod_php또는 더 정확하게 말하면, 링크 된 무수한 확장 및 라이브러리)은 일종의 스레드로부터 안전하지 않은 라이브러리를 가지고 있습니다. 안전한 코드)), 꽤 아파치 아파치 설치를 사용하지 않는 한, prefork MPM에 갈 것입니다.


3
PHP를 실행하지 않는 한 작업자 MPM을 권장했을 것입니다. 작업자는 아파치에서 권장하는 MPM이며 성능이 향상되고 오버 헤드가 줄어 듭니다. PHP 개발자는 프리 포크를 사용해야하는 스레드 안전성에 대해 들어 본 적이 없습니다.
David Pashley

16
PHP는 오랫동안 스레드 안전을 유지해 왔습니다. 다른 라이브러리의 기능을 제어 할 수 없으므로 프리 포커 사용 만 제안합니다. 다른 개발자의 비 활동으로 인해 PHP를 비난하지 마십시오.
Alister Bulman

3
PHP는 스레드 안전 할 수도 있지만 (의심하더라도) 링크되는 모든 라이브러리는 확실하지 않습니다. 여기서 우리는 상당히 큰 PHP 응용 프로그램을 실행하고 2 개월마다 프리 포크에서 작업자로 전환하려고 시도하지만 데이터가 즉시 손상됩니다.
Aleksandar Ivanisevic

5
최소한 ENV 변수를 변경하는 함수는 스레드로부터 안전하지 않습니다. setlocal php.net/manual/en/function.setlocale.php 는 일반적인 예입니다.
반경

4
참고 : PHP가 연결된 경우 (예 : php-fpmFastCGI 를 통해) 이러한 문제는 적용되지 않습니다 . 그런 다음 작업자 MPM은 괜찮습니다. 그러면 fpm은 모든 PHP 요청을 자체 프로세스로 실행하지만 Apache는 스레드를 실행할 수 있습니다. PHP-Thread-safety 문제 mod_php는 Apache 프로세스 내에서 PHP를 실행하는를 사용하지 못하게합니다 .
mschuett

13

많은 수 (> 100)의 동시 연결을 제공하면서 안전하지 않은 확장 프로그램을 실행하는 일반적인 솔루션은 fastCGI (기본 아파치 모듈 인 mod_fcgid)에서 PHP를 실행하고 Worker MPM을 실행하는 아파치 인스턴스에서 동적 요청을 프록시하는 것입니다.

이를 통해 정적 및 동적 컨텐츠를 혼합하여 제공 할 때 적당한 양의 메모리 (4 ~ 8GB)로 수백에서 최대 1000 개까지의 동시 연결을 확장 할 수 있습니다.

물론 전체 배포 (memcached, varnish)의 일부로 프런트 엔드 캐싱 솔루션도 조사해야합니다.

또는 아파치 2.4와 네이티브 이벤트 MPM으로 업그레이드하여 동시성을 훨씬 개선 된 방식으로 처리합니다 (스레드는 폴링 대기 중이 아니라 연결시 해제됩니다).


이벤트 mpm 코멘트를 확장 할 수 있습니까? mpm-worker와 어떻게 쌓아 올리나요?
Sirex

작업자 MPM은 이미 스레드 기반이므로 시작 및 실행 속도가 훨씬 빠르지 만 MPM 이벤트는 더 이상 소켓을 폴링하지 않으며 활동에 대한 알림을받습니다. 따라서 "이벤트".
adaptor

트래픽이 많은 (13k / sec) 사이트에서 더 잘 작동해야합니까?
Sirex

6

질문이 게시 된 지 약 3 년이 지났지 만 더 나은 성능을 얻으려면 PHP를 사용하더라도 프리 포크 대신 작업자 MPM을 사용하는 것이 좋습니다.

차이점에 대해 프리 포크는 스레드되지 않으므로 서버는 각 클라이언트 요청에 대해 프로세스를 포크합니다 (포크가 응답 시간에 들어 가지 않도록 새 요청을 예상하여 프리 포크합니다). 요청은 별도의 프로세스에있는 서버이므로 일반적으로 메모리와 CPU에 많은 양의 세금이 부과됩니다. 작업자는 멀티 스레딩을 제공하여 가볍고 메모리 사용률이 향상되었습니다.


2

이것은 당신이 제공하는 것에 매우 특별한 것입니다. 작은 정적 연결을 많이 수행하면 스레드가 더 가볍고 빨라집니다. 지속적으로 생성되는 큰 앱이 거의 없다면 prefork는 성숙도와 안정성으로 인해 우위를 차지할 수 있습니다. 필요한 것을 설정하고, 테스트하고, MPM 모듈을 교체하고, 다시 시도하고, 어느 것이 더 적합한 지 확인하십시오.


아파치 2.2에서 MPM을 임의로 "스왑 아웃"할 수는 없다. 컴파일 타임에 설정됩니다.
adaptor

apt 또는 RPM을 사용할 수 있습니다. 데비안은 선호하는 스타일에 따라 여러 가지 Apache 2 패키지가 있습니다.
Brendan Byrd

1

그 유형과 종류의 트래픽이 필요합니다. 또한 먼저 포크 포크와 작업자의 주요 차이점을 이해해야합니다. 아래 기사가 도움이되기를 바랍니다. http://slashroot.in/how-is-nginx-different-from-apache


2
콘텐츠에 대한 링크가 아니라 콘텐츠에 대한 답변을 선호합니다. 링크 대상에 대한 요약 정보를 제공 할 수있는 것이 가장 좋습니다. 링크 로트가 발생합니다.
sysadmin1138

1
질문은 아파치 (nginx는 아파치가 아님)와
프리 포크
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.