Apache Prefork vs Worker MPM

113

Olhando para o arquivo de configuração do Apache, vejo Prefork e Worker MPM definidos. Qual é a diferença e qual o Apache está usando?

Cory
fonte

Respostas:

120

Prefork e worker são dois tipos de MPM que o Apache fornece. Ambos têm seus méritos e deméritos.

Por padrão, mpm é prefork, que é seguro para threads.

O Prefork MPM usa vários processos filho com um thread cada e cada processo lida com uma conexão por vez.

O Worker MPM usa vários processos filho com muitos threads cada. Cada thread lida com uma conexão por vez.

Para obter mais detalhes, você pode visitar https://httpd.apache.org/docs/2.4/mpm.html e https://httpd.apache.org/docs/2.4/mod/prefork.html

Arvind
fonte
11
Consulte também "Como seleciono qual Apache MPM usar?" serverfault.com/a/383634
Nazariy
@arvind // Cada thread lida com uma conexão por vez // aqui conexão significa usuário único ou solicitação única? por
favor
21

Os Módulos de Multiprocessamento (MPMs) do Apache são responsáveis ​​por vincular às portas de rede na máquina, aceitar solicitações e enviar filhos para lidar com as solicitações ( http://httpd.apache.org/docs/2.2/mpm.html ).

Eles são como qualquer outro módulo Apache, exceto que apenas um e apenas um MPM deve ser carregado no servidor a qualquer momento . Os MPMs são escolhidos durante a configuração e compilados no servidor usando o argumento --with-mpm=NAMEcom o script de configuração onde NAMEé o nome do MPM desejado.

O Apache usará um MPM padrão para cada sistema operacional, a menos que um diferente seja escolhido no momento da compilação (por exemplo, no Windows mpm_winnté usado por padrão). Esta é a lista de sistemas operacionais e seus MPMs padrão:

Para verificar quais módulos são compilados no servidor, use a opção de linha de comando -l( aqui está a documentação). Por exemplo, em uma instalação do Windows, você pode obter algo como:

> httpd -l
Compiled in modules:
  core.c
  mod_win32.c
  mpm_winnt.c
  http_core.c
  mod_so.c

A partir da versão 2.2, esta é a lista de recursos principais e módulos MPM disponíveis :

  • core - Principais recursos do servidor HTTP Apache que estão sempre disponíveis
  • mpm_common - Uma coleção de diretivas que são implementadas por mais de um módulo de multi-processamento (MPM)
  • beos - Este Módulo de Multiprocessamento é otimizado para BeOS.
  • event - Uma variante experimental do MPM trabalhador padrão
  • mpm_netware Módulo de multiprocessamento implementando um servidor web exclusivamente encadeado otimizado para Novell NetWare
  • mpmt_os2 MPM híbrido multiprocesso, multiencadeamento para OS / 2
  • prefork Implementa um servidor da web pré-bifurcado sem thread
  • mpm_winnt - Este Módulo de Multiprocessamento é otimizado para Windows NT.
  • worker - Módulo de multiprocessamento implementando um servidor web híbrido multi-threaded multi-processo

Agora, para a diferença entre preforke worker.

O preforkMPM

implementa um servidor da web pré-bifurcado não encadeado que lida com solicitações de maneira semelhante ao Apache 1.3. É apropriado para sites que precisam evitar threading para compatibilidade com bibliotecas não thread-safe. É também o melhor MPM para isolar cada solicitação, de forma que um problema com uma única solicitação não afete nenhuma outra.

O workerMPM implementa um servidor híbrido multiprocessos multi-threaded e oferece melhor desempenho, portanto, deve ser preferível a menos que um esteja usando outros módulos que contenham bibliotecas não thread-safe (veja também esta discussão ou esta em Serverfault).

user2314737
fonte
1
Uma instalação padrão do ubuntu-trusty-64 do apache 2.4.7 está usando o evento MPM
Federico
9

Dê uma olhada nisso para obter mais detalhes. Refere-se a como o Apache lida com várias solicitações. A pré-bifurcação, que é o padrão, inicia vários processos do Apache (2 por padrão aqui, embora eu acredite que seja possível configurar isso por meio do httpd.conf). O Worker MPM iniciará um novo thread por solicitação, o que eu acho que é mais eficiente em termos de memória. Historicamente, o Apache usou prefork, então é um modelo mais bem testado. O encadeamento só foi adicionado no 2.0.

hd1
fonte
3
E quanto ao Event MPM?
Vince Kronlein
6

Para CentOS 6.xe 7.x (incluindo Amazon Linux), use:

sudo httpd -V

Isso mostrará quais dos MPMs estão configurados. Pré-garfo, trabalhador ou evento. Prefork é o modelo mais antigo, threadsafe. Worker é multi-threaded e o evento suporta php-mpm, que é suposto ser um sistema melhor para lidar com threads e solicitações.

No entanto, seus resultados podem variar, com base na configuração. Eu vi muita instabilidade no php-mpm e nenhuma melhora na velocidade. Uma aranha agressiva pode exaurir o máximo de processos filhos em php-mpm com bastante facilidade.

A configuração para prefork, trabalhador ou evento é definida em sudo nano /etc/httpd/conf.modules.d/00-mpm.conf (para CentOS 6.x / 7.x / Apache 2.4).

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#LoadModule mpm_event_module modules/mod_mpm_event.so
jeffmcneill
fonte
3

Você pode saber se o Apache está usando pré-forma ou trabalhador, emitindo o seguinte comando

apache2ctl -l

Na saída resultante, procure menções de prefork.c ou worker.c

Rimu Atkinson
fonte
8
O Apache pode ser compilado com ambos os módulos MPM, portanto, nem sempre é confiável. Se ele listar dois módulos MPM, tente apachectl -Volhar a saída ao lado de Server MPM. Também pode verificar ps auxe procurar por httpdou httpd.worker.
reflexiv
2
No meu caso apache2ctl -lnão funcionou; teve que usar apachectl -l.
Vacilando
2
nenhum deles está listado para mim, mas o apache funciona bem, Apache / 2.4.7 (Ubuntu)
karatedog
2
No centos 7.x que está executando o apache 2.4.6, httpd -Vdará algo como:Server MPM: worker
runamok
2

É fácil alternar entre prefork ou worker mpm no Apache 2.4 no RHEL7

Verifique o tipo de MPM executando

sudo httpd -V

Server version: Apache/2.4.6 (Red Hat Enterprise Linux)
Server built:   Jul 26 2017 04:45:44
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

Agora, para alterar o MPM, edite o arquivo a seguir e descomente o MPM necessário

 /etc/httpd/conf.modules.d/00-mpm.conf 

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so
Harsimranjit Singh Kler
fonte
Por que quando tentei usar mpm_worker ou mpm_event, não funcionou minha página
Leoh
0

O Apache tem 2 tipos de MPM (Módulos de Multi-Processamento) definidos:

1: Prefork 2: Trabalhador

Por padrão, o Apacke é configurado no modo pré-bifurcado, ou seja, servidor da web pré-bifurcado sem thread. Isso significa que cada processo filho do Apache contém um único thread e lida com uma solicitação por vez. Por isso, consome mais recursos.

O Apache também tem o MPM de trabalho que transforma o Apache em um servidor da web multiprocessos e multiencadeados. O Worker MPM usa vários processos filho com muitos threads cada.

Rahul Chaubey
fonte