nginx : Son Multithread, mais utilise plusieurs processus?
J'essaie de comprendre ce qui fait de Nginx si vite, et j'ai quelques questions.
Comme je le comprends, Apache soit génère un nouveau processus pour servir la demande génère un nouveau thread pour servir chaque demande. Puisque chaque nouveau thread actions espace d'adressage virtuel de l'utilisation de la mémoire conserve monte si il y a un certain nombre de requêtes simultanées venir dans.
Nginx résout ce problème en ayant juste un processus d'écoute(Master), avec un seul thread d'exécution ET de 2 ou 3(le numéro est configurable) les processus de travail. Ce Maître de processus/thread exécute une boucle d'événements. Effectivement en attente pour toutes les demandes entrantes. Lorsqu'une demande arrive, il donne à qui demande à l'un des processus de travail.
S'il vous plaît corrigez-moi si ma compréhension n'est pas correct
Si ce qui précède est correct, alors j'ai quelques questions:
1.) N'est-ce pas le processus de travail va générer plusieurs threads et va courir dans la même situation que apache ?
2.) Ou est-nginx rapide, car son événement basé sur une architecture utilise non bloquantes-IO en dessous de tout. Peut-être que le processus de travail engendre des threads qui ne seulement de blocage non-IO, est ce que c'est ?
3.) Ce "exactement" est l'événement "architecture", quelqu'un peut vraiment simplifier, pour soemone comme moi de comprendre. C'est juste qu'il a trait à la non-blocage-io ou quelque chose d'autre ?
J'ai eu une référence de c10k, je suis en train de passer par là, mais je ne pense pas que ses propos de l'événement en fonction de l'arch. il semble de plus pour les non bloquantes IO.
- Non bloquantes IO exige un événement basé sur l'architecture.
- Pour information, Juste au cas où vous souhaitez en savoir plus - j'ai blogué la réponse avec d'autres matériaux + de vidéos ici : planetunknown.blogspot.com/2011/02/...
Vous devez vous connecter pour publier un commentaire.
Il n'est pas très compliqué d'un point de vue conceptuel. Je vais essayer d'être clair, mais je dois faire de la simplification.
L'événement serveurs (comme nginx et lighttpd) utiliser un wrapper autour d'un événement système de surveillance. Par exemple. lighttpd utilise libevent à l'abstrait le plus avancé à haute vitesse de la surveillance des événements système (voir libev aussi).
Le serveur garde une trace de toutes les non bloquant les connexions qu'il a (à la fois de l'écriture et de la lecture) à l'aide d'une simple machine d'état pour chaque connexion. La surveillance des événements système avertit le serveur processus lorsqu'il y a de nouvelles données ou lorsqu'il peut écrire plus de données. C'est comme un
select()
sur les stéroïdes, si vous savez programmation socket. Le processus serveur alors il suffit d'envoyer le fichier demandé l'aide de quelques fonctions avancées commesendfile()
si possible ou transforme la demande à un processus CGI en utilisant un socket de communication (socket sera contrôlé grâce à la surveillance des événements de système comme les autres connexions réseau.)Cette lien comme une grande quantité d'informations sur le fonctionnement interne de nginx, juste au cas où. J'espère que cela aide.
Apache utilise plusieurs threads pour fournir à chaque demande avec son propre fil d'exécution. Cela est nécessaire pour éviter le blocage lors de l'utilisation synchrone I/O.
Nginx utilise uniquement des e/S asynchrones, ce qui rend le blocage d'un non-problème. La seule raison de nginx utilise plusieurs processus, est de faire pleinement usage de multi-core, multi-CPU et de la technologie hyper-threading systèmes. Même avec le support SMP, le noyau ne peut pas planifier un seul thread d'exécution sur plusieurs Processeurs. Elle nécessite au moins un processus ou un thread par CPU logique.
Donc, la différence est, nginx nécessite seulement assez de processus de travail pour obtenir le bénéfice complet de SMP, alors que Apache architecture nécessite la création d'un nouveau thread (chacune avec sa propre pile d'environ 8 MO) par demande. Évidemment, au haut de la simultanéité, Apache va utiliser beaucoup plus de mémoire et de souffrir plus grande charge de maintenir un grand nombre de threads.
Apache ne pas générer un nouveau thread pour chaque demande. Il maintient un cache des fils ou d'un groupe de pré-fourches processus qui c'fermes demandes. Le nombre de requêtes simultanées sont limitées par le nombre d'enfants/threads oui, mais apache n'est pas de frai un nouveau thread/enfant pour chaque demande qui serait ridiculement lent (même avec des fils, de la création et de la destruction pour chaque demande serait trop lent)
Nginx utilise un maître-travailleur modèle. Le processus maître traite de chargement de la configuration et de la création/destruction/maintien des travailleurs. Comme apache, elle commence avec un certain nombre de pré-fourches processus déjà en cours d'exécution dont chacun est un travailleur (et dont l'un est le "maître" du processus). CHAQUE processus de travail de partager un ensemble de sockets d'écoute. Chaque processus de travail accepte des connexions et des processus, mais chaque travailleur peut gérer des MILLIERS de connexions à la fois, contrairement à apache qui ne peut gérer 1 connexion par travailleur.
La façon de nginx réalise c'est par le biais de "multiplexage". Il n'utilise pas de libevent, il utilise un événement personnalisé boucle qui a été conçu spécifiquement pour nginx et a grandi dans le développement avec le développement de la nginx logiciel. Le multiplexage fonctionne en utilisant une boucle "incrémenter" par le biais d'un programme de morceau par morceau d'exploitation sur un morceau de données/nouvelle connexion/quelle que soit par connexion/objet par itération de boucle. Il est basé sur les backends comme Epoll() kqueue() et select(). Qui vous devriez lire sur