I was always under the impression that poll/epoll doesn’t block. That’s why they are used by non-blocking servers such as Nginx.
But in this Stackoverflow question it was stated several times that poll blocks.
So does poll/epoll block?
And how is poll/epoll different from async IO?
Yes, poll/epoll block. Servers that spin off threads to service clients typically don’t scale as well as servers that use an I/O event notification model like epoll. poll is older and less efficient than epoll (O(n) vs O(1)).
[UPDATE]
Nginx is not non-blocking. When a request comes in, one of the events epoll_wait is waiting for is notified and the call to epoll_wait returns. Then Nginx loops through the signaled events servicing each one. The Nginx source code is available here … http://nginx.org/download/nginx-1.1.1.tar.gz
Take a look at the
ngx_epoll_process_eventsfunction in nginx-1.1.1\src\event\modules\ngx_epoll_module.c[UPDATE2]
See also the man page for epoll_wait(2) … http://linux.die.net/man/2/epoll_wait
[UPDATE3]
To prove to yourself that Nginx / epoll blocks, try this on Linux…
./configure --with-debug(NOTE: I had to add libpcre3-dev)makesudo make install/usr/local/nginx/sbin/nginx(NOTE: I had to kill apache firstsudo /etc/init.d/apache2 stop)sudo gdbfile /usr/local/nginx/sbin/nginxb ngx_epoll_module.c:531(to set a break point)ps -ef | grep nginxand use the PID of the nginx worker process (not the master)attach <PID of nginx worker>continueto resume the processYou may have to
continuea couple times but it should eventually block. Then open a browser and go to http://localhost … the debugger should then break right afterepoll_waitreturns.