Pourquoi sondage n'est pas remplacé par epoll?

8

Le niveau déclenché epollest très similaire à poll. Pourquoi n'est-il pas polljuste un wrapper pour epollles systèmes prenant en charge ces derniers?

EDIT: Je veux dire, y a-t-il des obstacles techniques à une telle décision? Une mise pollen œuvre telle que celle- epollci augmenterait considérablement les performances de nombreuses applications réseau. Il devrait y avoir un problème technique que je ne remarque pas.

Nicht Verstehen
la source
5
Ce sont des appels système. Si vous ne savez pas de quoi il parle, vous devriez peut-être le chercher, mais sa question est parfaitement valable.
drrlvn
2
Les deux sont des appels système pour attendre toute activité sur un ensemble de descripteurs de fichiers. Epoll est spécifique à Linux 2.6+. J'ai ajouté des liens vers des pages de manuel.
Je sais ce que c'est. Mais il existe de nombreux systèmes de type Linux / Unix qui ont un sondage, et la question ne peut être répondue sans spécification sur les versions de quoi.
bmargulies
L'implémentation en polltant que wrapper pour epollserait incroyablement complexe et inefficace. Vous devrez soit mettre en place un nouveau descripteur epoll et le configurer à chaque fois, soit effectuer une comparaison douloureuse de l'ensemble de sondages actuel avec celui déjà associé au descripteur epoll. Beurk!
David Schwartz

Réponses:

2

le sondage est beaucoup plus simple pour les cas faciles; il est probablement tout aussi efficace pour un petit nombre de descripteurs de fichiers. L'appelant n'a pas à s'inquiéter de la maintenance des FD d'interrogation et de l'ajout / suppression de FD, il peut simplement ajouter tous ceux qu'il souhaite à chaque appel à interroger.

Mon sentiment est qu'ils sont complémentaires, même si le sondage POURRAIT être implémenté comme un wrapper pour epoll, il ne devrait probablement pas l'être.

epoll pourrait (presque) être implémenté comme wrapper pour poll, mais cela irait à l'encontre de ses arguments d'efficacité.

MarkR
la source
1
Telle est la réponse la plus probable. Je l'ai testé et epoll est vraiment 10 fois plus lent que poll pour 1 descripteur de fichier d'un fichier local (550 us pour 1000 polls et 5420 us pour 1000 epolls (créer + ctl + attendre + fermer)). epoll_wait était seulement 2 fois plus lent que poll.
1

La sémantique de poll()et epollest différente. Si poll()vous informe qu'un descripteur est lisible, alors vous effectuez une lecture mais ne lisez pas tous les octets disponibles, puis transmettez à poll()nouveau ce descripteur , il se réveillera immédiatement. AFAIK la même chose n'est pas vraie epoll.

Notez également que les epolldescripteurs sont une ressource limitée. La page de manuel parle de epoll_create()conditions d'échec avec lesquelles l'AFAIK ne se produit pas poll().

Bien que je ne sois pas sûr de tous les détails de l'implémentation, nous pouvons dire que cela n'a pas de sens de faire poll()un wrapper pour epoll. Le programmeur doit être conscient de ces points, et le code existant écrit avec les hypothèses le poll()permet se briserait.


la source
1
1. La saveur par défaut d'epoll (déclenchée par le niveau) agit comme un sondage (voir la section Description de la page de manuel d'epoll (7)). 2. Le sondage est essentiellement epoll_create + epoll_ctl + epoll + wait + close. Ainsi, le nombre de descripteurs epoll utilisés dans ce sondage imaginaire est limité par le nombre de threads effectuant un sondage simultanément. Il pourrait donc y avoir une technique pour ajuster max_user_instances pour refléter le nombre maximum de threads. 3. J'ai posté cette question en raison de la curiosité de ces hypothèses.
1

D'accord, 7 ans plus tard, j'ai une réponse plus convaincante basée sur cet article d'Evan Klitzke.

Premièrement, la raison pour laquelle j'ai posé la question en premier lieu est l'avantage de performance souvent mentionné epollpar rapport à poll/ select. Le mot va qui epollest asymptotiquement plus efficace (O (1)) que poll(O ( N )).

Ce qui n'est pas aussi largement connu, c'est que seul le déclenchement sur front epoll est vraiment O (1), tandis que le niveau déclenché epoll a les mêmes asymptotiques que O ( N ). En effet, la saveur déclenchée par le niveau doit parcourir la liste des fds surveillés chaque fois qu'elle est appelée pour trouver ceux qui ont potentiellement encore plus de données en attente. La variété déclenchée par le front peut s'appuyer sur des signaux en réponse à de nouveaux octets apparaissant dans un fd.

Il serait intéressant de savoir comment un thread repris reprend exactement quel fd l'a réveillé, mais il est certainement possible que cette donnée soit transmise pendant le réveil déclenché par epoll.

De toute évidence, poll/ selectne peut pas utiliser le déclenchement epoll par front car la sémantique est différente. Comme nous l'avons vu, l'implémentation avec un niveau déclenché epoll n'apporterait pas d'avantages de performances asymptotiques. Et peut-être aussi l'affecter négativement si des facteurs constants ou des termes constants sont élevés (car ils semblent être basés sur un repère grossier que j'ai fait et cité dans un autre commentaire).

Pour plus d'informations, veuillez lire E / S bloquantes, E / S non bloquantes et Epoll .

Nicht Verstehen
la source