Блокирует ли опрос / эполл? Чем он отличается от асинхронного ввода-вывода? - PullRequest
4 голосов
/ 26 августа 2011

У меня всегда было впечатление, что опрос / эполл не блокирует.Вот почему они используются неблокирующими серверами, такими как Nginx.

Но в этом вопросе Stackoverflow было несколько раз указано, что опрос блокирует.эпол блок?

А чем опрос / эполл отличается от асинхронного ввода-вывода?

1 Ответ

8 голосов
/ 26 августа 2011

Да, опрос / эполл блок. Серверы, которые выделяют потоки для обслуживания клиентов, обычно не масштабируются так же, как серверы, которые используют модель уведомлений о событиях ввода / вывода, такую ​​как epoll. опрос старше и менее эффективен, чем epoll (O (n) против O (1)).

[UPDATE]

Nginx не является неблокирующим. Когда поступает запрос, уведомляется об одном из событий, ожидающих epoll_wait, и возвращается вызов epoll_wait. Затем Nginx проходит через сигнальные события, обслуживающие каждое из них. Исходный код Nginx доступен здесь ... http://nginx.org/download/nginx-1.1.1.tar.gz

Посмотрите на функцию ngx_epoll_process_events в nginx-1.1.1 \ src \ event \ modules \ ngx_epoll_module.c

[UPDATE2]

См. Также справочную страницу для epoll_wait (2) ... http://linux.die.net/man/2/epoll_wait

#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

Задание времени ожидания -1 заставляет epoll_wait (2) ждать бесконечно, при указании времени ожидания, равного нулю, epoll_wait (2) возвращает немедленно, даже если нет доступных событий (код возврата равен ноль).

[Update3] * +1021 *

Чтобы доказать себе, что блокирует Nginx / epoll, попробуйте это в Linux ...

  1. Скачать исходный код и разархивировать
  2. перейдите в исходный каталог
  3. ./configure --with-debug (ПРИМЕЧАНИЕ: мне пришлось добавить libpcre3-dev)
  4. make
  5. sudo make install
  6. Для запуска nginx: /usr/local/nginx/sbin/nginx (ПРИМЕЧАНИЕ: мне сначала пришлось убить apache sudo /etc/init.d/apache2 stop)
  7. sudo gdb
  8. file /usr/local/nginx/sbin/nginx
  9. b ngx_epoll_module.c:531 (для установки точки останова)
  10. В другом окне терминала ps -ef | grep nginx и использовать PID рабочего процесса nginx (не главного)
  11. обратно в GDB, attach <PID of nginx worker>
  12. continue для возобновления процесса

Возможно, вам придется continue пару раз, но это должно в конечном итоге заблокировать. Затем откройте браузер и перейдите к http://localhost ... отладчик должен выйти из строя сразу после возврата epoll_wait.

...