Question

Tout ce que je l'ai lu et expérimenté (applications basées sur Tornado) me conduit à croire que ePoll est un remplacement naturel pour les réseaux à base Sélectionnez et le sondage, en particulier avec Twisted. Ce qui me rend paranoïaque, son assez rare pour une meilleure technique ou d'une méthodologie de ne pas venir avec un prix.

La lecture d'une comparaison couple douzaine entre epoll et alternatives montre que epoll est clairement le champion pour la vitesse et l'évolutivité, plus précisément qu'il adapte de façon linéaire ce qui est fantastique. Cela dit, au sujet de ce processeur et l'utilisation de la mémoire, est epoll encore le champion?

Était-ce utile?

La solution

Pour très petit nombre de prises (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 peut battre epoll dans l'utilisation de la mémoire et la vitesse d'exécution. Bien sûr, pour un si petit nombre de prises, les deux mécanismes sont si rapides que vous ne se soucient pas vraiment de cette différence dans la grande majorité des cas.

Une précision, cependant. Les deux échelle de sélection et epoll linéaire. Une grande différence, cependant, est que les API faisant face à l'espace utilisateur ont des complexités qui sont basées sur des choses différentes. Le coût d'un appel select va à peu près à la valeur du descripteur de fichier numéro le plus élevé que vous passez. Si vous sélectionnez sur un seul fd, 100, qui est plus ou moins deux fois plus cher que la sélection sur un seul fd, 50. Ajout de plus fds ci-dessous le plus élevé est pas tout à fait libre, donc il est un peu plus compliqué que cela dans la pratique, mais 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 en fait des événements sur eux. Si vous contrôlez 200 descripteurs de fichiers, mais seulement 100 d'entre eux ont des événements sur eux, alors vous êtes (très gros) en ne payant que pour les 100 descripteurs de fichiers actifs. C'est là epoll a tendance à offrir un de ses principaux avantages par rapport select. Si vous avez un millier de clients qui sont la plupart du temps d'inactivité, lorsque vous utilisez vous sélectionnez vous payez toujours pour tous les mille d'entre eux. Cependant, avec epoll, il est comme vous avez seulement quelques -. Vous ne payant que pour ceux qui sont actifs à un moment donné

Tout cela signifie que epoll conduira à moins d'utilisation CPU pour la plupart des charges de travail. En ce qui va utilisation de la mémoire, il est un peu pile ou face. select réussit à représenter toutes les informations nécessaires d'une manière très compacte (un bit par descripteur de fichier). Et le FD_SETSIZE (généralement 1024) la limitation du nombre de descripteurs fichier que vous pouvez utiliser avec select signifie que vous ne serez jamais dépenser plus de 128 octets pour chacun des trois ensembles fd vous pouvez utiliser avec select (lecture, écriture, exception). Par rapport à ceux de 384 octets max, epoll est une sorte de porc. Chaque descripteur de fichier est représenté par une structure multi-octets. Toutefois, en termes absolus, il est toujours ne va pas utiliser beaucoup de mémoire. Vous pouvez représenter un grand nombre de descripteurs de fichiers dans quelques dizaines de kilo-octets (environ 20k pour 1000 descripteurs de fichiers, je pense). Et vous pouvez également jeter dans le fait que vous devez dépenser tous les 384 de ces octets avec select si vous souhaitez uniquement surveiller un descripteur de fichier, mais sa valeur se trouve être 1024, wheras avec epoll vous ne souhaitez passer 20 octets. Pourtant, tous ces chiffres sont assez petits, donc il ne fait pas beaucoup de différence.

Et il y a aussi cet autre avantage de epoll, qui peut-être vous êtes déjà au courant, qu'il ne se limite pas à FD_SETSIZE descripteurs de fichiers. 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 avec aussi, mais select ne fonctionne pas.

Au hasard, je l'ai récemment découvert un léger inconvénient à epoll par rapport à select ou poll. Bien qu'aucun de ces trois API prend en charge les fichiers normaux (par exemple, les fichiers sur un système de fichiers), et select poll présente ce manque de soutien que la communication de ces descripteurs comme toujours lisibles et toujours inscriptible. Cela les rend impropres à tout type significatif de système de fichiers non bloquante E / S, un programme qui utilise select ou poll et arrive à rencontrer un descripteur de fichier à partir du système de fichier au moins continuer à fonctionner (ou si elle échoue, il ne sera pas être à cause de select ou poll), mais il peut-être pas la meilleure performance.

D'autre part, epoll échouera rapidement avec erROR (EPERM, apparemment) lorsqu'on lui a demandé de surveiller un tel descripteur de fichier. Au sens strict, c'est à peine incorrect. Il est simplement signaler son manque de soutien de manière explicite. Normalement, j'applaudis des conditions de défaillance explicites, mais celui-ci est sans papier (pour autant que je peux dire) et les résultats dans une application complètement cassée, plutôt que celui qui fonctionne uniquement avec des performances potentiellement dégradées.

Dans la pratique, le seul endroit que je l'ai vu venir est lors de l'interaction avec stdio. Un utilisateur peut rediriger stdin ou stdout de / vers un fichier normal. Alors qu'auparavant stdin et stdout aurait été un tuyau - soutenu par epoll très bien -. Il devient alors un fichier normal et epoll échoue à voix haute, brisant l'application

Autres conseils

Dans les tests de mon entreprise, un problème avec epoll () est venu, donc un seul coût par rapport à sélectionner.

Lors de la tentative de lecture du réseau avec un délai d'attente, la création d'un epoll_fd (au lieu d'un FD_SET), et en ajoutant le fd au epoll_fd, est beaucoup plus cher que la création d'un FD_SET (qui est un simple malloc).

Selon la réponse précédente, le nombre de IFD dans le processus devient important, le coût de select () devient plus élevé, mais dans nos tests, même avec des valeurs fd dans les 10 000 années, sélectionnez était encore un gagnant. Ce sont les cas où il n'y a qu'un seul fd qu'un fil est en attente sur, et simplement essayer de surmonter le fait que le réseau lire et écrire réseau, ne pas de délai d'attente lors de l'utilisation d'un modèle de fil de blocage. Bien sûr, les modèles de fil de blocage sont faibles performances par rapport aux systèmes de réacteur non-bloquant, mais il y a des occasions où, d'intégrer avec une base de code existant particulier, il est nécessaire.

Ce genre de cas d'utilisation est rare dans les applications de haute performance, car 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 long vécu --- qui est clairement préférée pour toute conception de serveur haute performance --- epoll est le gagnant clair dans tous les sens.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top