Да, опрос / эполл блок. Серверы, которые выделяют потоки для обслуживания клиентов, обычно не масштабируются так же, как серверы, которые используют модель уведомлений о событиях ввода / вывода, такую как 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 ...
- Скачать исходный код и разархивировать
- перейдите в исходный каталог
./configure --with-debug
(ПРИМЕЧАНИЕ: мне пришлось добавить libpcre3-dev)
make
sudo make install
- Для запуска nginx:
/usr/local/nginx/sbin/nginx
(ПРИМЕЧАНИЕ: мне сначала пришлось убить apache sudo /etc/init.d/apache2 stop
)
sudo gdb
file /usr/local/nginx/sbin/nginx
b ngx_epoll_module.c:531
(для установки точки останова)
- В другом окне терминала
ps -ef | grep nginx
и использовать PID рабочего процесса nginx (не главного)
- обратно в GDB,
attach <PID of nginx worker>
continue
для возобновления процесса
Возможно, вам придется continue
пару раз, но это должно в конечном итоге заблокировать. Затем откройте браузер и перейдите к http://localhost ... отладчик должен выйти из строя сразу после возврата epoll_wait
.