Passer au contenu principal

Le fonctionnement des threads sur Apache

Apache utilise un module appelé Multi-Processing Module (MPM). Ce module permet à Apache d’adopter une approche multi-thread, ce qui lui permet de gérer un grand nombre de requêtes tout en utilisant moins de ressources système qu’un serveur fonctionnant uniquement avec des processus.

Dans un modèle multi-processus, chaque requête est gérée par un processus distinct. Cela signifie que chaque requête dispose de son propre espace d’adressage et de ses propres ressources système. C’est une approche simple et robuste, car si un processus échoue, il n’affecte pas les autres processus. Cependant, la création de nouveaux processus est coûteuse en termes de ressources système, ce qui peut limiter le nombre de requêtes qu’un serveur peut gérer simultanément.

En revanche, dans un modèle multi-thread, chaque requête est gérée par un thread distinct au sein d’un processus. Les threads partagent l’espace d’adressage et les ressources système du processus, ce qui permet de gérer plus de requêtes avec moins de ressources. Cependant, si un thread échoue, il peut affecter les autres threads dans le même processus.

Voici comment cela fonctionne :

  1. Un processus de contrôle unique, appelé le processus parent, est chargé de lancer les processus enfants.
  2. Chaque processus enfant crée un certain nombre de threads de serveur spécifié par la directive ThreadsPerChild. En plus de ces threads, chaque processus enfant crée également un thread d’écoute qui attend les connexions entrantes et les transmet à un thread de serveur pour traitement.
  3. Apache s’efforce de maintenir un pool de threads de serveur inactifs prêts à servir les requêtes entrantes. Cela signifie que les clients n’ont pas à attendre qu’un nouveau thread ou processus soit créé pour que leurs requêtes soient traitées.
  4. Le nombre de processus qui seront lancés au démarrage est défini par la directive StartServers.
  5. Pendant son fonctionnement, Apache évalue le nombre total de threads inactifs dans tous les processus et crée ou supprime des processus pour maintenir ce nombre dans les limites spécifiées par les directives MinSpareThreads et MaxSpareThreads.
  6. Le nombre maximum de requêtes qui peuvent être traitées simultanément (c’est-à-dire le nombre total maximum de threads dans tous les processus) est déterminé par la directive MaxRequestWorkers.
  7. Le nombre maximum de processus enfants actifs est déterminé par la directive MaxRequestWorkers divisée par la directive ThreadsPerChild.