2012-01-13 9 views
11

Czy istnieje kilka prostych zasad kciuk kiedy używać poll Vs. epoll w środowisku o niskiej latencji? epoll powinien mieć wyższy narzut, jeśli monitorowanych jest tylko kilka deskryptorów plików. Proszę dać trochę wglądu, odpowiedzi "sprawdź to sam" umieścić gdzie indziej.poll vs. epoll wglądu

+0

Prywatne anegdota: moje wyniki badania epoll vs. ankiety w jednym procesie (nie ma żadnych wątków, widły) asynchroniczny serwer HTTP (czyli krótkie czasy połączeń, <1000 jednoczesnych gniazda, dając ~ 10000 wywołań/s), że różnica między nimi jest znikoma. Zobacz mój komentarz do odpowiedzi użytkownika, dlaczego. – delicateLatticeworkFever

Odpowiedz

13

Zawsze używaj poll chyba wszystkie z poniższych kryteriów są spełnione:

  1. można zapewnić sobie w systemie (Linux), który ma epoll lub zapewnić zabezpieczenie dla systemów, które nie.
  2. Masz ogromny liczbę deskryptorów czynną (co najmniej 1000-10000).
  3. Zestaw deskryptorów plików, z którymi pracujesz, jest stabilny przez długi czas (dodawanie/usuwanie deskryptorów plików z listy epoll jest tak samo kosztowne jak operacja poll, ponieważ wymaga ona wejścia/wyjścia z przestrzeni jądra).
2

epoll(7) podsumowuje to zwięźle: epoll "dobrze skaluje się do dużej liczby obserwowanych deskryptorów plików." Jednak poll jest standardowym interfejsem POSIX, więc używaj tego, gdy wymagana jest przenośność.

+0

Tak, skaluje się, ale jeśli liczba fds jest mała, 'poll' powinna być szybsza. – Cartesius00

+4

@ James: Naprawdę chciałbym zobaczyć kilka benchmarków na ten temat. Z własnego doświadczenia wynika, że ​​biorąc pod uwagę, że robisz coś w reakcji na wydarzenie, nie ma dużej różnicy. Biorąc pod uwagę, że sam musisz utrzymywać wektor ankiety, mogę nawet zgadnąć, że epoll jest szybszy. Ważną różnicą jest, jak stwierdzono w tej odpowiedzi, że sonda jest POSIX, a zatem bardziej przenośna. Epoll ma także tę zaletę, że oferuje kilka dodatkowych funkcji. – PlasmaHH

8

Przede wszystkim poll(2) jest wyzwalany tylko poziomem, ale epoll(4) może być użyty jako interfejs wyzwalany na poziomie krawędzi lub poziomu.

Teraz Złożoność: poll złożoność dotyczące liczby oglądanych deskryptorów (FDS) jest O (n), ponieważ skanuje wszystkie FDS za każdym razem, gdy pojawia się „gotowe” zdarzenie, epoll jest w zasadzie O (1), gdyż nie wykonaj skanowanie liniowe wszystkich obserwowanych deskryptorów.

Pod względem przenośności - jako specyficzny dla systemu Linux, sugeruję wypróbowanie bibliotek libev i libevent. Sprawdź także znakomity zapis Dana Kegla: "The C10K problem".

+2

Uważam, że punktem o epolu i wielkiej notacji O * nie jest wewnętrzna część żadnej z funkcji *, więc niepoprawne jest powiedzenie, że "sonda skanuje wszystkie deskryptory, podczas gdy epoll nie". * Oba mogą potencjalnie wywołać pojedyncze zdarzenie *. Jednak przy ankiecie użytkownik nie ma innego wyboru, jak tylko przejrzeć całą listę przesłaną w celu znalezienia zdarzeń, podczas gdy z epolem otrzymujesz listę zawierającą tylko faktyczne zdarzenia. Oznacza to, że jeśli serwer jest bardzo zajęty, nie ma żadnej korzyści dla epoll. Jednakże, jeśli utrzymujesz bardzo dużą liczbę deskryptorów przez długi czas ... – delicateLatticeworkFever

+0

... a większość z nich jest bezczynna przez większość czasu, epoll będzie miał przewagę, jeśli masz bardzo szybkie zdarzenia z udziałem tylko kilku połączeń . Tj. O (cokolwiek) dotyczy tego, co jest * możliwe * dla implementacji użytkownika, a nie faktycznego zachowania poll/epoll. – delicateLatticeworkFever

Powiązane problemy