Como seleciono qual MPM do Apache usar?

261

Esta é uma pergunta canônica sobre como selecionar o Apache httpd MPM correto.

Estou um pouco confuso entre os diferentes MPMs oferecidos pelo Apache - 'worker', 'event', 'prefork' etc.

Quais são as principais diferenças entre eles e como posso decidir qual será o melhor para uma determinada implantação?

Tiffany Walker
fonte
4
Se você está suportando o mod_php, está fazendo o prefork.
precisa
6
@Zoredache:? ela nunca mencionou PHP e, mesmo que tivesse, o mod_php descartaria apenas o evento. Ou você ainda se apega a uma observação feita pela RL há 8 anos? Última bug registrado no PHP relacionadas com apache rosca foi em 2005.
symcbean
2
Desculpe - tenho que votar para encerrar isso - é uma pergunta muito ampla para responder aqui.
symcbean
1
@symcbean Re: PHP e Threads - O núcleo do PHP é seguro hoje em dia, mas muitas outras coisas nas quais você encontrará pessoas que compilam não são. Eu fui mordido tão recentemente como no ano passado, por isso é muito mais um "teste (extensivamente) antes de invocar em produção" situação ainda ...
voretaq7
Dependendo do sistema operacional que você está usando, você pode nem ter todas essas opções disponíveis em uma instalação padrão.
John Gardeniers

Respostas:

415

Há uma série de módulos MPM (Multi-Processing Modules), mas, de longe, o mais utilizado (pelo menos em plataformas * nix) são os três principais: prefork, worker, e event. Essencialmente, eles representam a evolução do servidor da web Apache e as diferentes maneiras em que o servidor foi criado para lidar com solicitações HTTP dentro das restrições de computação do tempo ao longo de sua longa história (em termos de software).


prefork

mpm_preforké .. bem .. é compatível com tudo. Ele gera vários processos filhos para atender solicitações, e os processos filhos atendem apenas uma solicitação por vez. Como o processo do servidor está lá, pronto para a ação e sem a necessidade de lidar com o agrupamento de encadeamentos, é realmente mais rápido que os MPMs encadeados mais modernos quando você está lidando apenas com uma única solicitação por vez - mas as solicitações simultâneas sofrem, pois eles são feitos para esperar na fila até que um processo do servidor seja gratuito. Além disso, ao tentar aumentar a contagem de processos-filhos pré-fork, você sugará facilmente uma RAM séria.

Provavelmente não é aconselhável usar o prefork, a menos que você precise de um módulo que não seja seguro para threads.

Use if: Você precisa de módulos que quebrem quando threads são usados, como mod_php. Mesmo assim, considere usar o FastCGI e php-fpm.

Não use se: Seus módulos não quebram na segmentação.

worker

mpm_workerusa threading - o que é uma grande ajuda para a simultaneidade. O Worker gera alguns processos filhos, que, por sua vez, geram threads filhos; semelhante ao prefork, alguns threads sobressalentes são mantidos prontos, se possível, para atender às conexões de entrada. Essa abordagem é muito mais gentil na RAM, pois a contagem de threads não afeta diretamente o uso de memória, como a contagem de servidores no pré-fork. Ele também lida com a concorrência com muito mais facilidade, já que as conexões precisam apenas esperar por um encadeamento livre (que geralmente está disponível) em vez de um servidor sobressalente no prefork.

Use se: Você está no Apache 2.2 ou 2.4 e está executando principalmente SSL.

Não use se: Você realmente não pode dar errado, a menos que precise de pré-fork para compatibilidade.

No entanto, observe que os passos são anexados a conexões e não a solicitações - o que significa que uma conexão keep-alive mantém sempre um thread em espera até que ele seja fechado (o que pode levar muito tempo, dependendo da sua configuração). É por isso que temos ..

event

mpm_eventé muito semelhante ao trabalhador, estruturalmente; acabou de passar do status 'experimental' para 'estável' no Apache 2.4. A grande diferença é que ele usa um encadeamento dedicado para lidar com as conexões mantidas ativas, e envia solicitações para encadeamentos filhos apenas quando uma solicitação foi realmente feita (permitindo que esses encadeamentos façam backup imediatamente após a conclusão da solicitação). Isso é ótimo para a simultaneidade de clientes que não estão necessariamente ativos de cada vez, mas fazem solicitações ocasionais e quando os clientes podem ter um tempo limite longo e ativo.

A exceção aqui é com conexões SSL; nesse caso, ele se comporta de forma idêntica ao trabalhador (colando uma determinada conexão a um determinado encadeamento até que a conexão seja fechada).

Use if: Você está no Apache 2.4 e gosta de threads, mas não gosta de ter threads aguardando conexões inativas. Todo mundo gosta de tópicos!

Não use se: Você não está no Apache 2.4 ou precisa de pré-fork para compatibilidade.


No mundo atual de slowloris , AJAX e navegadores que gostam de multiplexar 6 conexões TCP (com keep-alive, é claro) para o servidor, a simultaneidade é um fator importante para tornar o servidor dimensionável e bem dimensionado. A história do Apache o vinculou a esse respeito e, embora ainda não esteja ao mesmo nível de nginx ou lighttpd em termos de uso ou escala de recursos, é claro que a equipe de desenvolvimento está trabalhando na construção de um servidor da web que ainda é relevante no mundo atual de alta solicitação e simultaneidade.

Shane Madden
fonte
3
-1: IME, worker apenas reduz o tamanho da pegada httpd na região de 15% (o IIRC Linux relata COW no RSS, o que faz com que o pré-fork pareça estar usando muito mais memória do que ele). Há uma diferença insignificante entre o espaço ocupado pelo kernel de um processo e um encadeamento NPTL. É um longo caminho desde a destruição da terra. Não entendo por que você acha que aguardar e alocar um encadeamento é mais eficiente em termos de agendamento do que aguardar / agendar um processo (pré-bifurcado). Nem o que você acha que o SSL tem em geral.
symcbean
9
@symcbean Então você está dizendo que o uso de 15% de RAM não é significativo? Tudo bem, mas minha opinião seria diferente. As reivindicações de desempenho de simultaneidade não são minhas. Veja aqui . E a diferença de SSL está explicitada claramente na documentação do evento MPM:The improved connection handling does not yet work for certain connection filters, in particular SSL. For SSL connections, this MPM will fall back to the behaviour of the worker MPM and reserve one worker thread per connection.
Shane Madden
3
@ShaneMadden `e, embora ainda não pareça com o nginx ou o lighttpd em termos de uso ou escala de recursos, tive o apache nos dois sistemas.
Kelly Elton
@ShaneMadden em relação ao problema com SSL e ao evento MPM: Você sabe se o nginx lida com isso significativamente melhor do que o apache?
DASKAjA
Parece que se você compilar o apache 2.4 sem conhecer os módulos mpm, ele vem com o módulo event mpm module e funciona com mod_php7 (agora estou pesquisando mpm porque o apache2.4 está excedendo o limite de conexão do mysql enquanto o apache 2.2 com o mesmo servidor mysql está )
BioHazard 8/16
8

Aqui está uma boa explicação de como ele funciona com gifs:

https://www.datadoghq.com/blog/monitoring-apache-web-server-performance/

Resumidamente: se você está no 2.4 e precisa do httpd como proxy reverso (expedidor), sua escolha é um MPM de Evento

Yura
fonte
Mesmo se usarmos SSL? Eu uso o apache como proxy e ativador de SSL em um site não SSL.
bokan 14/01
@bokan parece que sim, isso é o melhor, mas mesmo assim o proxy é limitado para SSL
Yura
Uau ~ O post do blog é muito melhor do que a resposta aceita, e os gifs são maravilhosos! Thankssss. Você salvou o meu dia.
Rick
6

A partir de fevereiro de 2018, a documentação do Apache 2.4 para o MPM de eventos indica que o uso do Apache como proxy manterá o "tratamento aprimorado da conexão" desde a 2.4.24, conforme funcionado. Veja a seção Limitações .

O problema é que, como proxy, o trabalhador não pode dizer onde está o final da resposta e será forçado a esperar até que toda a resposta seja vista antes de retornar o controle ao ouvinte.

Por esse motivo, parece que usar o modelo Worker pode ser melhor para quando o apache é usado como proxy. Não está realmente claro para mim se existem vantagens para o modelo de evento em um ambiente proxy, mas talvez haja.

AndOr
fonte
5

Depende principalmente de quais módulos do Apache você deseja usar. Eu acho que worker geralmente é a opção padrão, mas alguns módulos (mais antigos) exigem bifurcação e dependem do prefork.

Se você não tiver preferências, recomendo que você escolha a dependência preferida da sua distribuição do SO. O Ubuntu, por exemplo, instalará o mpm-worker por padrão quando você instalar o Apache2.

Jeroen
fonte