99 votes

Mises en garde de sélectionner/sondage vs epoll réacteurs dans Twisted

Tout ce que j'ai lu et expérimenté ( Tornade en fonction des applications ) m'amène à croire que ePoll est un remplacement naturel pour les Sélectionner et de Sondage en fonction de réseau, en particulier avec Tordus. Ce qui me rend paranoïaque, c'est assez rare pour une meilleure technique ou de la méthodologie de ne pas venir avec un prix.

La lecture de quelques dizaines de comparaisons entre epoll et alternatives montre que epoll est clairement le champion de la vitesse et de l'évolutivité, plus précisément, qu'il évolue de façon linéaire, ce qui est fantastique. Cela dit, ce sujet de processeur et l'utilisation de la mémoire, est epoll encore le champ?

198voto

Jean-Paul Calderone Points 27680

Pour un très petit nombre de sockets (varie en fonction de votre matériel, bien sûr, mais nous parlons de quelque chose de l'ordre de 10 ou moins), sélectionnez pouvez battre epoll dans l'utilisation de la mémoire et de la vitesse d'exécution. Bien sûr, pour un tel petit nombre de sockets, les deux mécanismes sont si rapides que vous n'avez pas vraiment au sujet de cette différence dans la très grande majorité des cas.

Une précision, cependant. Sélectionnez et epoll à l'échelle linéaire. Une grande différence, cependant, est que l'utilisateur face à des Api ont des complexités qui sont basées sur des choses différentes. Le coût d'un select appel va à peu près avec la valeur de la plus haute numérotés fichier descripteur de vous le transmettre. Si vous sélectionnez un seul fd, 100, alors que c'est à peu près deux fois plus cher que la sélection sur un seul fd, 50. Ajout de plus de fds en dessous du plus haut n'est pas tout à fait libre, donc c'est un peu plus compliqué que cela, dans la pratique, mais c'est une bonne première approximation pour la plupart des implémentations.

Le coût de epoll est plus proche du nombre de descripteurs de fichiers qui ont réellement des événements sur eux. Si vous êtes à la surveillance de 200 descripteurs de fichiers, mais seulement 100 d'entre eux ont des événements sur eux, alors vous êtes (très grossièrement) en ne payant que pour ceux de 100 active des descripteurs de fichiers. C'est là que epoll tend à offrir à l'un de ses principaux avantages par rapport à sélectionner. Si vous avez un millier de clients qui sont pour la plupart inactif, puis lorsque vous utilisez select vous êtes encore payer pour tous d'un millier d'entre eux. Cependant, avec epoll, c'est comme si vous avez seulement quelques - unes, vous êtes de ne payer que pour ceux qui sont actifs à un moment donné.

Tout cela signifie que epoll va conduire à réduire l'utilisation du PROCESSEUR pour la plupart des charges de travail. Aussi loin que l'utilisation de la mémoire va, c'est un peu un tirage au sort. select ne parviennent à représenter toutes les informations nécessaires dans un très compacte (un bit par descripteur de fichier). Et le FD_SETSIZE (généralement 1024) limitation du nombre de descripteurs de fichiers, vous pouvez utiliser select signifie que vous ne serez jamais passer plus de 128 octets pour chacun des trois fd jeux que vous pouvez utiliser avec select (à lire, à écrire, à l'exception). Par rapport à ceux de 384 octets max, epoll est une sorte de cochon. Chaque descripteur de fichier est représenté par un multi-octets de la structure. Toutefois, en termes absolus, c'est toujours pas utiliser trop de mémoire. Vous pouvez représenter un grand nombre de descripteurs de fichiers en quelques dizaines de kilo-octets (environ 20k par 1000 les descripteurs de fichier, je pense). Et vous pouvez également jeter dans le fait que vous avez à dépenser de tous les 384 de ces octets avec select si vous ne souhaitez surveiller un descripteur de fichier, mais que sa valeur se passe en 1024, wheras avec epoll (vous ne dépenser 20 octets. Encore, tous ces chiffres sont assez petits, de sorte qu'il n'a pas beaucoup de différence.

Et il y a aussi d'autres avantages de epoll, qui peut-être vous êtes déjà au courant, qu'il n'est pas limité à FD_SETSIZE les descripteurs de fichier. Vous pouvez l'utiliser pour surveiller autant de descripteurs de fichiers que vous avez. Et si vous avez seulement un descripteur de fichier, mais sa valeur est supérieure à FD_SETSIZE, epoll fonctionne aussi, mais select ne le sont pas.

Au hasard, j'ai découvert récemment un léger inconvénient d' epoll par rapport à l' select ou poll. Bien qu'aucun de ces trois Api prend en charge les fichiers normaux (c'est à dire, de fichiers sur un système de fichiers) select et poll présenter ce manque de soutien que les rapports de ces descripteurs comme toujours lisible et toujours accessible en écriture. Cela les rend impropres à quelle sorte de non-blocage du système de fichiers I/O, un programme qui utilise select ou poll , et qui rencontre un descripteur de fichier du système de fichiers permettra au moins de continuer à fonctionner (ou si elle échoue, elle ne sera pas à cause de l' select ou poll), quoique peut-être pas avec les meilleures performances.

D'autre part, epoll échouent rapide avec une erreur (EPERM, apparemment, lorsqu'on lui a demandé de surveiller un tel descripteur de fichier. Strictement parlant, ce n'est pas incorrect. C'est simplement signe de son manque de soutien d'une manière explicite. Normalement, je devrais applaudir explicite les conditions d'échec, mais celui-ci est sans-papiers (pour autant que je puisse dire) et les résultats dans un complètement brisé application, plutôt que de simplement fonctionne avec potentiellement une dégradation des performances.

Dans la pratique, le seul endroit que j'ai vu c'est lors de l'interaction avec stdio. Un utilisateur peut rediriger stdin ou stdout partir de/vers un fichier normal. Alors qu'auparavant, stdin et stdout aurait été un tube, appuyée par epoll juste des beaux -- il devient alors un fichier normal et epoll ne parvient pas à haute voix, casser l'application.

4voto

Brian Bulkowski Points 187

Dans des essais dans mon entreprise, un problème avec epoll (), donc un coût unique par rapport à sélectionner.

Lorsque l'on tente de lire à partir du réseau avec un délai d'attente, la création d'un epoll_fd ( au lieu d'un FD_SET ), et l'ajout de la fd à la epoll_fd, est beaucoup plus cher que la création d'un FD_SET (qui est un simple malloc).

Conformément à la réponse précédente, comme le numéro de la FDs dans le processus devient grand, le coût de select() est plus élevé, mais lors de nos tests, même avec fd valeurs dans les 10 000, sélectionnez était toujours un gagnant. Ce sont les cas où il y a un seul fd qu'un thread est en attente, et tout simplement en essayant de surmonter le fait que le réseau de lecture et d'écriture sur le réseau, n'a pas de délai d'attente lors de l'utilisation d'un blocage modèle de thread. Bien sûr, le blocage de fil de modèles sont de faible rendement par rapport aux non-blocage des systèmes de réacteur, mais il y a des occasions où, pour intégrer un héritage particulier de la base de code, il est nécessaire.

Ce genre de cas est rare dans les applications de haute performance, en raison d'un modèle de réacteur n'a pas besoin de créer un nouveau epoll_fd à chaque fois. Pour le modèle où un epoll_fd est de longue durée --- qui est clairement privilégiée pour n'importe quel serveur hautes performances design --- epoll est le gagnant clair dans tous les sens.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X