120 votes

Apache Prefork vs Worker MPM

En regardant le fichier de configuration d'Apache, je vois que Prefork et Worker MPM sont définis. Quelle est la différence et lequel Apache utilise-t-il ?

122voto

Arvind Points 566

Prefork et worker sont deux types de MPM fournis par Apache. Les deux ont leurs mérites et leurs démérites.

Par défaut, mpm est prefork qui est thread safe.

Prefork MPM utilise plusieurs processus enfants avec un thread chacun et chaque processus gère une connexion à la fois.

Worker MPM utilise plusieurs processus enfants avec de nombreux threads chacun. Chaque thread gère une connexion à la fois.

Pour plus de détails, vous pouvez visiter https://httpd.apache.org/docs/2.4/mpm.html y https://httpd.apache.org/docs/2.4/mod/prefork.html

13 votes

Voir aussi "Comment choisir le MPM Apache à utiliser ?". serverfault.com/a/383634

0 votes

@arvind //Chaque thread gère une connexion à la fois// ici la connexion signifie un seul utilisateur ou une seule demande ? pls expliquer

23voto

user2314737 Points 1671

Les modules multiprocesseurs (MPM) d'Apache sont chargés de se lier aux ports réseau de la machine, d'accepter les demandes et de répartir les enfants pour traiter les demandes ( http://httpd.apache.org/docs/2.2/mpm.html ).

Ils sont comme n'importe quel autre module Apache, sauf que juste un et un seul MPM doit être chargé dans le serveur à tout moment. . Les MPM sont choisis lors de la configuration et compilé dans le serveur en utilisant l'argument --with-mpm=NAME avec la commande configure script où NAME est le nom du MPM souhaité.

Apache utilisera un MPM par défaut pour chaque système d'exploitation à moins qu'un MPM différent ne soit choisi à la compilation (par exemple sous Windows mpm_winnt est utilisé par défaut). Voici la liste des systèmes d'exploitation et de leurs MPMs par défaut :

  • BeOS beos
  • Netware mpm_netware
  • OS/2 mpmt_os2
  • Unix/Linux prefork ( mise à jour pour Apache version 2.4 : prefork , worker ou event (en fonction des capacités de la plate-forme)
  • Windows mpm_winnt

Pour vérifier quels modules sont compilés dans le serveur, utilisez l'option de la ligne de commande -l ( aquí est la documentation). Par exemple, sur une installation Windows, vous pourriez obtenir quelque chose comme :

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

À partir de la version 2.2, c'est le liste des fonctions de base et des modules MPM disponibles :

  • core - Fonctions de base du serveur HTTP Apache qui sont toujours disponibles
  • mpm_common - Une collection de directives qui sont mises en œuvre par plus d'un module multiprocesseur (MPM).
  • beos - Ce module multiprocesseur est optimisé pour BeOS.
  • event - Une variante expérimentale de l'ouvrier standard MPM
  • mpm_netware Module multiprocesseur mettant en œuvre un serveur web exclusivement threadé optimisé pour Novell NetWare
  • mpmt_os2 MPM hybride multi-processus et multi-fil pour OS/2
  • prefork Implémente un serveur web non threadé et pré-forking.
  • mpm_winnt - Ce module multiprocesseur est optimisé pour Windows NT.
  • worker - Module de multitraitement mettant en œuvre un serveur web hybride multitraitement et multithread.

Maintenant, la différence entre prefork y worker .

El prefork MPM

implémente un serveur web non threadé, pré-forking qui traite les d'une manière similaire à Apache 1.3. Il est approprié pour sites qui ont besoin d'éviter le threading pour des raisons de compatibilité avec bibliothèques non threadées. Il s'agit également du meilleur MPM pour isoler chaque requête, de sorte que le problème d'une seule requête n'affecte pas les autres. autres.

El worker MPM implémente un serveur hybride multi-processus multi-fil et donne de meilleures performances, il devrait donc être préféré à moins que l'on utilise d'autres modules qui contiennent des bibliothèques non threadées (voir aussi cette discussion o este sur Serverfault).

9voto

hd1 Points 11522

Jetez un coup d'œil à este pour plus de détails. Il s'agit de la façon dont Apache gère les requêtes multiples. Preforking, qui est la valeur par défaut, démarre un certain nombre de processus Apache (2 par défaut ici, bien que je pense que l'on puisse configurer cela via httpd.conf). Worker MPM démarre un nouveau thread par requête, ce qui, je pense, est plus efficace en termes de mémoire. Historiquement, Apache a utilisé prefork, donc c'est un modèle mieux testé. Le threading n'a été ajouté qu'en 2.0.

3 votes

Qu'en est-il de Event MPM ?

6voto

jeffmcneill Points 15

Pour CentOS 6.x et 7.x (y compris Amazon Linux), utilisez :

sudo httpd -V

Cela vous montrera quels MPM sont configurés. Soit prefork, worker, ou event. Prefork est le modèle précédent, threadsafe. Worker est multi-threadé, et event supporte php-mpm qui est supposé être un meilleur système pour gérer les threads et les requêtes.

Cependant, vos résultats peuvent varier, en fonction de la configuration. J'ai constaté beaucoup d'instabilité dans php-mpm et aucune amélioration de la vitesse. Un spider agressif peut épuiser le maximum de processus enfants dans php-mpm assez facilement.

Le paramètre pour prefork, worker ou event est défini dans sudo nano /etc/httpd/conf.modules.d/00-mpm.conf (pour 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

3voto

Rimu Atkinson Points 585

Vous pouvez savoir si Apache utilise preform ou worker en lançant la commande suivante

apache2ctl -l

Dans la sortie résultante, recherchez les mentions de prefork.c ou worker.c

9 votes

Apache peut être compilé avec les deux modules MPM, ce qui n'est pas toujours fiable. S'il liste deux modules MPM, essayez apachectl -V et regardez la sortie à côté de Server MPM . Vous pouvez également vérifier ps aux et cherchez soit httpd o httpd.worker .

3 votes

Dans mon cas apache2ctl -l n'a pas fonctionné ; il a fallu utiliser apachectl -l .

2 votes

Aucun d'entre eux n'est listé pour moi, pourtant apache fonctionne bien, Apache/2.4.7 (Ubuntu)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X