Perché il sondaggio non viene sostituito con epoll?


8

Il livello attivato epollè molto simile a poll. Perché non è pollsolo un wrapper per epollsistemi che supportano quest'ultimo?

EDIT: Voglio dire, ci sono ostacoli tecnici contro tale decisione? L'implementazione pollcome epollaumenterebbe notevolmente le prestazioni di molte applicazioni di rete. Dovrebbero esserci alcuni problemi tecnici che non riesco a notare.


5
Queste sono chiamate di sistema. Se non hai idea di cosa stia parlando, forse dovresti cercarlo, ma la sua domanda è perfettamente valida.
drrlvn,

2
Entrambi sono syscalls in attesa di qualsiasi attività su un set di descrittori di file. Epoll è specifico per Linux 2.6+. Ho aggiunto collegamenti a pagine man.

So cosa sono. Ma ci sono molti sistemi simili a Linux / Unix che hanno il sondaggio e alla domanda non si può rispondere senza dettagli su quali versioni di cosa.
bmargulies,

L'implementazione pollcome wrapper per epollsarebbe incredibilmente complessa e inefficiente. Dovresti o impostare un nuovo descrittore epoll e configurarlo ogni volta o dovresti fare un confronto doloroso tra il set di sondaggi corrente e quello già associato al descrittore epoll. Che schifo!
David Schwartz,

Risposte:


2

il sondaggio è molto più semplice per casi semplici; è probabilmente altrettanto efficace per un numero limitato di descrittori di file. Non è necessario che il chiamante si preoccupi di mantenere gli FD del sondaggio e di aggiungere / rimuovere gli FD, ma possono semplicemente aggiungere tutti quelli desiderati in ogni chiamata al sondaggio.

La mia sensazione è che siano complementari, anche se il sondaggio POTREBBE essere implementato come wrapper per epoll, probabilmente non dovrebbe esserlo.

epoll potrebbe (quasi) essere implementato come un wrapper per il sondaggio, ma ciò annullerebbe i suoi argomenti di efficienza.


1
Questa è la risposta più probabile. L'ho provato ed epoll è davvero 10 volte più lento del poll per 1 descrittore di file di un file locale (550 us per 1000 sondaggi e 5420 us per 1000 epolls (create + ctl + wait + close)). epoll_wait è stato solo 2 volte più lento del sondaggio.

1

La semantica di poll()e epollè diversa. Se poll()ti informa che un descrittore è leggibile, fai qualche lettura ma non leggi tutti i byte disponibili, quindi passa poll()nuovamente quel descrittore , si risveglierà immediatamente. AFAIK lo stesso non è vero epoll.

Si noti inoltre che i epolldescrittori sono una risorsa limitata. La manpage parla delle epoll_create()condizioni di errore con cui AFAIK non si verificano poll().

Anche se non sono sicuro di tutti i dettagli dell'implementazione, da questo possiamo dire che non ha senso creare poll()un wrapper epoll. Il programmatore deve essere a conoscenza di questi punti e il codice esistente scritto con le ipotesi poll()consentite si spezzerebbe.


1
1. Il sapore predefinito di epoll (attivato dal livello) si comporta come un sondaggio (vedere la sezione Descrizione della pagina man per epoll (7)). 2. Il sondaggio è essenzialmente epoll_create + epoll_ctl + epoll + wait + close. Quindi il numero di descrittori di epoll usati in questo sondaggio immaginario è limitato dal numero di thread che eseguono il sondaggio contemporaneamente. Quindi potrebbe esserci una tecnica per regolare max_user_instances in modo da riflettere il numero massimo di thread. 3. Ho pubblicato questa domanda a causa della curiosità su quali fossero questi presupposti.

1

Ok, 7 anni dopo ho una risposta più convincente basata su questo articolo di Evan Klitzke.

In primo luogo, il motivo per cui ho posto la domanda in primo luogo è il vantaggio prestazionale spesso menzionato epollrispetto a poll/ select. Si dice che epollè asintoticamente più efficiente (O (1)) di poll(O ( N )).

Ciò che non è come ampiamente noto è che solo edge-triggered epoll è veramente O (1), mentre il livello trggered epoll ha le stesse asintotica di O ( N ). In effetti, il sapore innescato dal livello deve andare oltre l'elenco dei file fds guardati ogni volta che viene chiamato per trovare quelli che potenzialmente hanno ancora più dati in sospeso. La varietà innescata dai bordi può fare affidamento sui segnali in risposta a nuovi byte che compaiono in una fd.

Sarebbe interessante scoprire come esattamente un thread ripreso scopra chi lo ha svegliato, ma è certamente possibile che questo dato venga passato durante il wake-up innescato da epoll.

Ovviamente, poll/ selectnon è possibile utilizzare edge-triggered epoll poiché la semantica è diversa. Come abbiamo visto, l'implementazione con trigger di livello epoll non comporterebbe benefici in termini di prestazioni asintotiche. E possibilmente, anche influenzarlo negativamente se i fattori costanti o i termini costanti sono alti (in quanto sembrano essere basati su un benchmark approssimativo che ho fatto e citato in un altro commento).

Per ulteriori informazioni, leggi I / O bloccanti, I / O non bloccanti ed Epoll .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.