Qual instalar: Apache Worker ou Prefork? Quais são as (des) vantagens de cada um?

55

Com base nas descrições do Prefork e Worker MPM, parece que o tipo de prefork está um pouco desatualizado, mas não consigo encontrar uma comparação adequada dos dois tipos.

O que eu gostaria de saber:

  • Quais são as diferenças entre as duas versões?
  • Quais são as (des) vantagens de cada tipo de servidor?
  • Existem diretrizes básicas sobre qual tipo escolher com base nas condições?
  • Existem grandes diferenças de desempenho entre os dois?
Aron Rotteveel
fonte

Respostas:

40

Como dizem os documentos, você deve usar o MPM prefork se precisar evitar o encadeamento para compatibilidade com bibliotecas que não são seguras para threads. Normalmente, qualquer módulo não-trivial do Apache ( mod_php- ou, mais precisamente, a infinidade de extensões e bibliotecas às quais ele se vincula - sendo o exemplo canônico) tem algum tipo de biblioteca não-thread-safe (ou não-thread-safe). código seguro), então, a menos que você esteja usando uma instalação bonita do Apache, eu optaria pelo MPM pré-fork.

mulher
fonte
3
Eu recomendaria o MPM de trabalho, a menos que você esteja executando o PHP. Worker é o MPM recomendado do apache e oferece melhor desempenho e menor sobrecarga. Só que o desenvolvedor do PHP nunca ouviu falar em segurança de threads que você precisa usar o prefork.
David Pashley
16
O PHP é seguro para threads há muito tempo. Eles apenas sugerem o uso de pre-forkers, pois não podem controlar o que outras bibliotecas fazem. Pare de culpar o PHP por outras inações de desenvolvedores.
Alister Bulman
3
O PHP pode ser seguro para threads (embora eu duvide), mas todas as bibliotecas às quais ele se vincula definitivamente não são. Aqui, executamos alguns aplicativos PHP bastante grandes e, a cada dois meses, tentamos mudar do prefork para o worker, mas obtemos dados corrompidos imediatamente.
Aleksandar Ivanisevic
5
Pelo menos a variável ENV de alteração de função não será segura para threads, setlocal php.net/manual/en/function.setlocale.php é um exemplo comum disso.
raio
4
Uma observação: Esses problemas não se aplicam se o PHP estiver anexado, por exemplo, php-fpmvia via FastCGI. Então o MPM de trabalho está bem - então o fpm executará todas as solicitações de PHP em um próprio processo enquanto o Apache pode executar threads. O problema do PHP-Thread-safety apenas o impede de usar mod_php, que executa o PHP dentro do processo Apache.
mschuett
13

A solução clássica para executar extensões inseguras enquanto atende a um grande número (> 100) de conexões simultâneas é executar o PHP em fastCGI (mod_fcgid, um módulo apache nativo) e solicitações dinâmicas de proxy a partir de uma instância apache que executa o MPM do Trabalhador.

Isso permitiria escalar de algumas centenas a mais de 1000 conexões simultâneas com uma quantidade modesta de memória (4 a 8 GB) ao exibir uma mistura de conteúdo estático e dinâmico.

Obviamente, você também deve investigar soluções de cache de front-end como parte de sua implantação geral (memcached, verniz).

Como alternativa, atualize para o apache 2.4 e seu evento nativo MPM, que lida com a simultaneidade de uma maneira muito melhorada (os threads são disparados na conexão, sem esperar pela pesquisa).

adaptr
fonte
você poderia expandir o comentário mpm do evento? Como ele se compara ao mpm-worker?
Sirex
Enquanto o MPM do trabalhador já era baseado em encadeamento e, portanto, muito mais rápido para iniciar e mais leve para executar, o evento MPM não pesquisa mais o soquete - ele é notificado sobre a atividade; portanto, "evento".
Adaptr
para que funcione melhor em sites de alto tráfego (13k / s)?
Sirex 20/05
6

Já se passaram cerca de 3 anos desde que a pergunta foi publicada, mas eu recomendaria que você trabalhasse com MPM de trabalho, em vez de pré-bifurcação, mesmo se estiver usando PHP, para obter o melhor desempenho.

Quanto às diferenças, a pré-bifurcação não é encadeada, portanto, o servidor bifurca um processo para cada solicitação do cliente (pré-bifurca-se na antecipação de novas solicitações, para que a bifurcação não consuma tempo de resposta). Como as solicitações são do servidor em um processo separado, isso geralmente sobrecarrega sua memória e CPU muito mais do que. O trabalhador traz multithreading, mais leve e com melhor utilização da memória.

aleemb
fonte
2

Isso é algo muito particular para o que você está servindo. Se você estiver fazendo muitas pequenas conexões estáticas, os threads serão mais leves e mais rápidos. Se você tiver poucos aplicativos grandes constantemente gerados, o prefork pode ter uma vantagem devido à sua maturidade e estabilidade. Por que não apenas configurar o que você precisa, testar um, trocar o módulo MPM, tentar novamente, ver qual combina melhor com você?

Marcin
fonte
Você não pode "trocar" arbitrariamente o MPM no apache 2.2; é definido no tempo de compilação.
adaptr
Você pode com o apt ou RPMs. O Debian possui vários pacotes diferentes do Apache 2, dependendo do estilo que você preferir.
Brendan Byrd
1

que precisa do tipo e tipo de tráfego que você terá. E também primeiro você precisa entender a principal diferença entre o prefork e o worker. Espero que o artigo abaixo o ajude a descobrir! http://slashroot.in/how-is-nginx-different-from-apache

sarath
fonte
2
Preferimos respostas para ter conteúdo, não links para conteúdo. Se você puder fornecer um resumo do que está no destino do link, essa é a melhor prática. Rot-link acontece.
sysadmin1138
11
Pergunta foi sobre Apache (nginx não é apache) e os méritos relativos de prefork ou threads (nginx usos nem)
symcbean