Les serveurs web non-forking (alias single-threaded ou select()
-based) tels que lighttpd ou nginx ont de plus en plus de popularité en .Comment fonctionne un serveur Web non-forking?
Bien qu'il existe une multitude de documents expliquant les serveurs de forking (à différents niveaux de détail), la documentation pour les serveurs non-forking est clairsemée.
Je cherche une vue des yeux d'oiseaux de comment un serveur web non bifurquer fonctionne. (Pseudo-) code ou un diagramme de la machine d'état, dénudé au minimum serait formidable.
Je connais les ressources suivantes et les a trouvées utiles.
Cependant, je suis intéressé par les principes, pas de détails de mise en œuvre.
Plus précisément:
Pourquoi ce type de serveur parfois appelé non-blocage, lorsque
select()
essentiellement des blocs?Le traitement d'une requête peut prendre un certain temps. Que se passe-t-il avec les nouvelles demandes pendant cette période lorsqu'il n'y a pas de thread ou de processus d'écoute spécifique? Le traitement de la demande est-il interrompu ou le temps est-il coupé?
Edit: Si je comprends bien, alors qu'une demande est traitée (fichier de lecture ou exécution par exemple script CGI) le serveur ne peut pas accepter de nouvelles connexions. Cela ne signifie-t-il pas qu'un tel serveur pourrait manquer beaucoup de nouvelles connexions si un script CGI fonctionne, disons, 2 secondes environ?
Je pense qu'un serveur Web non-bifurquer serait un mauvais match à tout serveur Web qui voulait serveur plus qu'une quantité négligeable de contenu dynamique . – Eddie
@Eddie Pas le moins du monde. Avec n processeurs, avoir plus de n threads ne va pas vous permettre de faire plus de travail. Un serveur asynchrone correctement conçu peut faire autant de travail qu'un forking ou un thread. –
@Nick Johnson: Cela dépend. Si vous avez N processeurs et N threads, dans la mesure où une seule requête bloque l'attente d'E/S, vous n'utilisez pas votre processeur à moins de créer plusieurs threads. Par exemple, si vous devez accéder à la base de données pour satisfaire une requête dynamique, ce thread est arrêté jusqu'à ce que vous obteniez une réponse. Avec seulement N threads, vous pouvez passer le plus clair de votre temps à attendre et seulement une petite partie de votre temps de traitement. – Eddie