¿Por qué la encuesta no se reemplaza con epoll?

8

Nivel activado epolles muy similar a poll. ¿Por qué no es pollsolo un contenedor para epollsistemas compatibles con este último?

EDITAR: Quiero decir, ¿hay barreras técnicas contra tal decisión? La implementación pollcomo epollaumentaría drásticamente el rendimiento de muchas aplicaciones de red. Debería haber algún problema técnico que no noto.

Nicht Verstehen
fuente
55
Estas son llamadas al sistema. Si no tienes idea de lo que está hablando, tal vez deberías buscarlo, pero su pregunta es perfectamente válida.
drrlvn
2
Ambas son llamadas al sistema para esperar cualquier actividad en un conjunto de descriptores de archivo. Epoll es específico de Linux 2.6+. Agregué enlaces a páginas de manual.
Sé lo que son. Pero hay muchos sistemas similares a Linux / Unix que tienen sondeo, y la pregunta no puede responderse sin detalles sobre qué versiones de qué.
bmargulies
Implementarlo pollcomo envoltorio epollsería increíblemente complejo e ineficiente. Tendría que configurar un nuevo descriptor de epoll y configurarlo cada vez o tendría que hacer una comparación dolorosa del conjunto de encuestas actual con el ya asociado con el descriptor de epoll. ¡Qué asco!
David Schwartz

Respuestas:

2

la encuesta es mucho más simple para casos fáciles; Probablemente sea igual de eficiente para un pequeño número de descriptores de archivos. La persona que llama no necesita preocuparse por mantener los FDs de la encuesta y agregar / eliminar FDs, solo puede agregar todos los que desee en cada llamada para sondear.

Mi sensación es que son complementarios, aunque la encuesta PODRÍA implementarse como una envoltura para epoll, probablemente no debería serlo.

epoll podría (casi) implementarse como un contenedor para la encuesta, pero eso derrotaría sus argumentos de eficiencia.

MarkR
fuente
1
Esa es la respuesta más probable. Lo probé y epoll es realmente 10 veces más lento que la encuesta para 1 descriptor de archivo de un archivo local (550 us por 1000 encuestas y 5420 us por 1000 epolls (crear + ctl + esperar + cerrar)). epoll_wait únicamente fue solo 2 veces más lento que la encuesta.
1

La semántica de poll()y epollson diferentes. Si poll()le informa que un descriptor es legible, entonces lee un poco pero no lee todos los bytes disponibles, y luego pasa ese descriptor poll()nuevamente, se activará de inmediato. AFAIK lo mismo no es cierto epoll.

También tenga en cuenta que los epolldescriptores son un recurso limitado. La página de manual habla sobre las epoll_create()condiciones de falla con las que AFAIK no ocurre poll().

Si bien no estoy seguro de todos los detalles de implementación, de esto podemos decir que no tiene sentido crear poll()un contenedor epoll. El programador debe ser consciente de estos puntos, y el código existente escrito con los supuestos poll()permitidos se rompería.


fuente
1
1. El sabor predeterminado de epoll (activado por nivel) actúa como una encuesta (consulte la sección Descripción de la página de manual para epoll (7)). 2. La encuesta es esencialmente epoll_create + epoll_ctl + epoll + wait + close. Entonces, el número de descriptores de epoll usados ​​en esta encuesta imaginaria está limitado por el número de hilos que realizan la encuesta simultáneamente. Por lo tanto, podría haber alguna técnica para ajustar max_user_instances para reflejar el número máximo de subprocesos. 3. Publiqué esta pregunta por curiosidad acerca de cuáles eran esos supuestos.
1

Bien, 7 años después tengo una respuesta más convincente basada en este artículo de Evan Klitzke.

En primer lugar, la razón por la que hice la pregunta en primer lugar es la ventaja de rendimiento a menudo mencionada en epollcomparación con poll/ select. La palabra dice que epolles asintóticamente más eficiente (O (1)) que poll(O ( N )).

Lo que no es tan ampliamente conocido es que solo el disparo por flanco epoll es verdaderamente O (1), mientras que el disparado por nivel epoll tiene los mismos síntomas de O ( N ). De hecho, el sabor activado por nivel tiene que pasar por la lista de archivos vistos cada vez que se llama para encontrar los que potencialmente aún tienen más datos pendientes. La variedad activada por el borde puede confiar en las señales en respuesta a los nuevos bytes que aparecen en un fd.

Sería interesante averiguar cómo exactamente un hilo reanudado descubre qué fd lo despertó, pero ciertamente es posible que este dato se transmita durante la activación activada por epoll.

Obviamente, poll/ selectno puedo usar edge-trigger epoll ya que la semántica es diferente. Como vimos, la implementación con activación por nivel epoll no traería beneficios de rendimiento asintótico. Y posiblemente, también lo afecte negativamente si los factores constantes o los términos constantes son altos (ya que parecen estar basados ​​en un punto de referencia aproximado que hice y cité en otro comentario).

Para obtener más información, lea Bloqueo de E / S, E / S sin bloqueo y Epoll .

Nicht Verstehen
fuente