Por que a enquete não é substituída por epoll?

8

O nível acionado epollé muito parecido com poll. Por que não é pollapenas um invólucro para epollsistemas que suportam o último?

EDIT: Quero dizer, existem barreiras técnicas contra essa decisão? A implementação pollcomo epolldrasticamente aumentaria o desempenho de muitos aplicativos de rede. Deve haver algum problema técnico que não percebo.

Nicht Verstehen
fonte
5
Essas são chamadas do sistema. Se você não tem idéia do que ele está falando, talvez deva procurar, mas a pergunta dele é perfeitamente válida.
drrlvn
2
Ambos são syscalls para aguardar qualquer atividade em um conjunto de descritores de arquivo. Epoll é específico para Linux 2.6+. Eu adicionei links para páginas de manual.
Eu sei o que eles são. Mas existem muitos sistemas linux / unix que possuem poll, e a pergunta não pode ser respondida sem detalhes sobre quais versões do quê.
bmargulies
Implementar pollcomo um wrapper para epollseria incrivelmente complexo e ineficiente. Você precisaria configurar um novo descritor de epoll e configurá-lo a cada vez ou teria que fazer uma comparação dolorosa da pesquisa atual definida com a já associada ao descritor de epoll. Que nojo!
David Schwartz

Respostas:

2

pesquisa é muito mais simples para casos fáceis; provavelmente é tão eficiente para pequenos números de descritores de arquivos. O chamador não precisa se preocupar em manter os DFs de pesquisa e adicionar / remover FDs; eles podem apenas adicionar todos os que desejam em cada chamada para pesquisa.

Meu sentimento é que eles são complementares, embora a pesquisa possa ser implementada como um invólucro para epoll, provavelmente não deveria ser.

O epoll poderia (quase) ser implementado como um invólucro para a enquete, mas isso derrotaria seus argumentos de eficiência.

MarkR
fonte
11
Essa é a resposta mais provável. Eu testei e o epoll é realmente 10 vezes mais lento que a pesquisa para um descritor de arquivo de um arquivo local (550 nós por 1000 pesquisas e 5420 nós por 1000 pesquisas) (criar + ctl + esperar + fechar). epoll_wait foi apenas duas vezes mais lento que a pesquisa.
1

A semântica de poll()e epollé diferente. Se poll()você informar que um descritor é legível, você faz algumas leituras, mas não lê todos os bytes disponíveis e, em seguida, passa esse descritor poll()novamente, ele será ativado imediatamente. AFAIK o mesmo não é verdade epoll.

Observe também que os epolldescritores são um recurso limitado. A página de manual fala sobre epoll_create()condições de falha com as quais o AFAIK não ocorre poll().

Embora eu não tenha certeza de todos os detalhes da implementação, podemos dizer que não faz sentido criar poll()um invólucro epoll. O programador deve estar ciente desses pontos, e o código existente escrito com as suposições poll()permitidas seria interrompido.


fonte
11
1. O sabor padrão do epoll (acionado por nível) age como uma enquete (consulte a seção Descrição da página de manual do epoll (7)). 2. A pesquisa é essencialmente epoll_create + epoll_ctl + epoll + wait + close. Portanto, o número de descritores de epoll usados ​​nessa pesquisa imaginária é limitado pelo número de threads que executam a pesquisa simultaneamente. Portanto, pode haver alguma técnica para ajustar max_user_instances para refletir o número máximo de threads. 3. Publiquei essa pergunta devido à curiosidade sobre quais eram essas suposições.
1

Ok, sete anos depois, tenho uma resposta mais convincente com base neste artigo de Evan Klitzke.

Em primeiro lugar, a razão pela qual fiz a pergunta em primeiro lugar é a vantagem de desempenho frequentemente mencionada em epollcomparação com poll/ select. Diz a palavra que epollé assintoticamente mais eficiente (O (1)) do que poll(O ( N )).

O que não é tão conhecido é que apenas o disparo por borda epoll é verdadeiramente O (1), enquanto o disparo por nível epoll tem os mesmos assintóticos de O ( N ). De fato, o sabor acionado por nível precisa passar por cima da lista de fds vigiados toda vez que é chamado para encontrar aqueles que potencialmente ainda têm mais dados pendentes. A variedade acionada por borda pode depender de sinais em resposta a novos bytes que aparecem em um fd.

Seria interessante descobrir como exatamente um encadeamento retomado descobre qual fd o despertou, mas certamente é possível que esse dado seja transmitido durante a ativação do epoll.

Obviamente, poll/ selectnão pode usar borda desencadeada epoll como a semântica são diferentes. Como vimos, a implementação com acionamento por nívelepoll não traria benefícios de desempenho assintóticos. E, possivelmente, também o afetará negativamente se os fatores constantes ou os termos constantes forem altos (como parecem basear-se em uma referência grosseira que eu fiz e citei em outro comentário).

Para obter mais informações, leia E / S de bloqueio, E / S sem bloqueio e Epoll .

Nicht Verstehen
fonte