Maison > Opération et maintenance > Nginx > Pourquoi nginx est-il si rapide ?

Pourquoi nginx est-il si rapide ?

步履不停
Libérer: 2019-06-25 14:14:45
original
3917 Les gens l'ont consulté

Pourquoi nginx est-il si rapide ?

La raison principale est que Nginx utilise le dernier modèle d'E/S réseau epoll (noyau Linux 2.6) et kqueue (freebsd).

epoll est une méthode de multiplexage des E/S (I/O Multiplexing), mais elle n'est utilisée que pour les noyaux Linux 2.6 et supérieurs. Avant de commencer à discuter de ce problème, expliquons pourquoi le multiplexage des E/S est requis. .

Expliquons-le avec un exemple dans la vie

Supposons que vous étudiez à l'université et que vous deviez attendre la visite d'un ami, et que cet ami sait seulement que vous êtes dans le bâtiment numéro A. , mais je ne sais pas où vous habitez précisément, vous avez donc pris rendez-vous à la porte du bâtiment A.

Si vous utilisez le modèle IO bloquant pour résoudre ce problème, alors vous ne pouvez qu'attendre au bâtiment A tout le temps. En attendant que vos amis arrivent à la porte du bâtiment, vous ne pouvez rien faire d'autre. Il n'est pas difficile de savoir que l'efficacité de cette méthode est faible. > Aujourd'hui, les temps ont changé et le multiplexage a commencé à être utilisé. Le modèle IO est utilisé pour résoudre ce problème. Vous dites à votre ami de venir au bâtiment A et demandez au gestionnaire du bâtiment de vous indiquer comment y aller. le rôle des IO multiplexés

Expliquez plus en détail la différence entre les modèles select et epoll

Ce que fait la tante de la version select est la suivante : Par exemple, lorsque l'ami du camarade de classe A arrive, le select. la version tante est stupide, et elle emmène ses amis de pièce en pièce pour vérifier qui est qui. C'est le camarade de classe A. L'ami que vous attendiez est là, donc dans le code actuel, la version tante sélectionnée fait ce qui suit :


Mise en évidence de code réalisée par Actipro CodeHighlighter (freeware)


int
n = select(&readset,NULL,NULL, 100);

pour
(int i = 0 ; n > 0; ++i){

si
(FD_ISSET(fdarray[i], &readset)){ do_something(fdarray[i]);
--n;
}
}


La version epoll est plus avancée, elle l'a écrite. Si vous avez les informations du camarade de classe A, comme son numéro de chambre, alors lorsque l'ami du camarade de classe A arrive, il vous suffit de dire à l'ami quelle est la chambre du camarade de classe A. dedans, et vous n'avez pas à chercher quelqu'un dans le bâtiment plein de monde. Donc la version epoll Ce que fait la tante peut être représenté par le code suivant :



Mise en évidence de code produite par Actipro CodeHighlighter (gratuit)
n
=epoll_wait( epfd,événements,20, 500);

pour
(i=0 ;i<n;++i){do_something(events [n]);
}



Dans epoll, la structure de données clé epoll_event est définie comme suit :

typedef union epoll_data {
void * ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;

struct epoll_event {
__uint32_t événements
/* Événements Epoll */
epoll_data_t data
/* Variable de données utilisateur */
} ;

 ; , epoll_data est une structure d'union, qui est la structure utilisée par la version epoll de tante pour enregistrer les informations sur les camarades de classe. Elle peut enregistrer de nombreux types d'informations : fd, pointeurs, etc. Avec cette structure, epoll tante peut les localiser sans aucun effort. Au camarade de classe A.

Ne sous-estimez pas ces améliorations d'efficacité. Dans un serveur simultané à grande échelle, l'interrogation des entrées/sorties est l'une des opérations les plus chronophages. Pour en revenir à l'exemple, si à chaque fois la construction d'un ami. Le directeur veut interroger ses camarades de classe dans tout le bâtiment, donc l'efficacité du traitement sera inévitablement faible. Bientôt, il y aura beaucoup de monde sur le sol

Comparez le premier modèle de traitement des E/S bloquantes, on peut voir que. après avoir utilisé les E/S multiplexées, le programme peut effectuer librement son propre travail, à l'exception des opérations d'E/S. Ce n'est que lorsque l'état d'E/S change que les E/S multiplexées le notifieront, puis effectueront les opérations correspondantes, au lieu d'avoir à bloquer et à attendre que l'état d'E/S change. .

De l'analyse ci-dessus, on peut également voir que l'amélioration d'epoll par rapport à select est en fait une application spécifique de l'idée d'échanger de l'espace contre du temps.

Pour plus d'articles techniques liés à Nginx, veuillez visiter la colonne Tutoriel Nginx pour apprendre !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal