Опрос против epoll insight

Существуют ли некоторые простые правила, когда использовать poll vs. epoll в среде с низкой задержкой? epoll должен иметь более высокие накладные расходы, если отслеживается только небольшое количество файловых дескрипторов. Пожалуйста, дайте некоторое представление, ответы "проверьте это сами", в другом месте.

Ответ 1

Всегда используйте poll, если не выполняются все следующие условия:

  • Вы можете убедиться, что находитесь в системе (Linux), которая имеет epoll или вы предоставляете резервную копию для систем, которые этого не делают.
  • У вас есть огромный число дескрипторов файлов (не менее 1000-10000).
  • Набор файловых дескрипторов, с которыми вы работаете, стабилен в течение длительного периода времени (добавление/удаление дескрипторов файлов из списка epoll столь же дорого, как и операция poll, так как для этого требуется ввести/оставить kernelspace).

Ответ 2

Прежде всего, poll(2) запускается только по уровню, но epoll(4) может использоваться как интерфейс с граничным или уровнем.

Теперь сложность: poll сложность относительно количества просмотренных дескрипторов (fds) - это O (n), когда он сканирует все fds каждый раз, когда происходит "готовое" событие, epoll в основном O (1), поскольку он не выполняет линейное сканирование по всем наблюдаемым дескрипторам.

В терминах переносимости - поскольку epoll является специфичным для Linux, я бы предложил проверить libev и libevent. Кроме того, ознакомьтесь с замечательной записью Дэна Кегеля: " Проблема C10K".

Ответ 3

epoll(7) кратко суммирует его: epoll "хорошо масштабируется для большого количества просмотренных файловых дескрипторов". Однако poll является стандартным интерфейсом POSIX, поэтому используйте его, когда требуется переносимость.