Apache Prefork vs travailleur MPM
6 réponses
Prefork et worker sont deux types de MPM qu'apache fournit. Tous deux ont leurs mérites et leurs limites.
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 des processus enfants multiples avec de nombreux fils chacun. Chaque fil gère une connexion à la fois.
pour plus détails vous pouvez visiter https://httpd.apache.org/docs/2.4/mpm.html et https://httpd.apache.org/docs/2.4/mod/prefork.html
les Modules multi-processeurs (MPMs) D'Apache sont responsables de la connexion aux ports réseau de la machine, de l'acceptation des requêtes et de l'envoi des enfants pour traiter les requêtes ( http://httpd.apache.org/docs/2.2/mpm.html ).
ils sont comme n'importe quel autre module Apache, sauf que juste un seul MPM doit être chargé dans le serveur à tout moment . Les MPM sont choisis configuration et compilé dans le serveur en utilisant l'argument --with-mpm=NAME
avec le script de configuration où NAME
est le nom du MPM désiré.
Apache utilisera un MPM par défaut pour chaque système d'exploitation à moins qu'un autre ne soit choisi lors de la compilation (par exemple sur Windows mpm_winnt
est utilisé par défaut). Voici la liste des systèmes d'exploitation et de leurs MPM par défaut:
- BeOS
beos
- Telecare
mpm_netware
- OS / 2
mpmt_os2
- Unix / Linux
prefork
( mise à jour pour la version Apache ≥ 2.4 :prefork
,worker
, ouevent
, selon les capacités de la plate-forme) - Windows
mpm_winnt
pour vérifier ce que les modules sont compilés dans le serveur en utilisant l'option de commande -l
( ici 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
depuis la version 2.2 ceci est la liste des caractéristiques de base disponibles et des modules MPM :
-
core
- principales fonctionnalités du serveur HTTP Apache qui sont toujours disponibles -
mpm_common
- un ensemble de directives qui sont mises en œuvre par Plus d'un module Multi-traitement (MPM) -
beos
- ce Module Multi-Processing est optimisé pour les BeOS. -
event
- une variante expérimentale du MPM ouvrier standard -
mpm_netware
Module Multi-processus de mise en œuvre exclusivement filetée serveur web optimisé pour Novell NetWare -
mpmt_os2
Hybride multi-processus multi-thread MPM pour OS/2 -
prefork
met en œuvre un non filetée, avant de bifurquer serveur web -
mpm_winnt
- ce Module Multi-Processing est optimisé pour Windows NT. -
worker
- Module Multi-processus de mise en œuvre d'un hybride multi-thread multi-processus serveur web
Maintenant, la différence entre prefork
et worker
.
The prefork
MPM
implémente un serveur web pré-forké sans fil qui gère requêtes d'une manière similaire à Apache 1.3. Il est approprié pour sites qui doivent éviter de fileter pour la compatibilité avec bibliothèques non-thread-safe. Il est également le meilleur MPM pour isoler chaque demande, de sorte qu'un problème avec une seule requête n'aura aucune incidence sur autre.
le worker
MPM implémente un serveur multi-processus multi-threadé hybride et donne une meilleure performance, il devrait donc être préféré à moins que l'on utilise d'autres modules qui contiennent des bibliothèques non-thread-safe (voir aussi this discussion or this on Serverfault).
regardez ce pour plus de détails. Il fait référence à 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 le configurer via httpd).conf). Worker MPM va lancer un nouveau thread par requête, ce qui, je pense, est plus efficace en termes de mémoire. Historiquement, Apache a utilisé prefork, c'est donc un modèle mieux testé. Le filetage n'a été ajouté qu'en 2.0.
Pour CentOS 6.x et 7.x (y compris Amazon Linux) utiliser:
sudo httpd -V
cela vous montrera quels MPMs sont configurés. Prefork, worker, ou event. Prefork est le premier, threadsafe modèle. Worker est multi-threadé, et event supporte php-mpm qui est censé ê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 vu beaucoup d'instabilité dans php-mpm et pas toutes les améliorations de la vitesse. Une araignée agressive peut facilement épuiser les processus enfants maximums en php-mpm.
le réglage pour prefork, worker, ou event est défini dans sudo nano /etc/httpd/conf.module.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
vous pouvez dire si Apache utilise preform ou worker en émettant la commande suivante
apache2ctl -l
dans la sortie résultante, recherchez les mentions de prefork.c ou de travailleur.c
il est facile de basculer entre les prefork ou mpm worker dans Apache 2.4 sur RHEL7
Vérifier le type de MPM en exécutant
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"
maintenant, pour changer MPM modifier le fichier suivant et de décommenter MPM requis
/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