Tornadowebnginx 目前是流行的Web服务器,许多基准测试表明它们在某些情况下的性能比Apache更好。所以我的问题是:

“ epoll”是使它们如此之快的最重要的原因吗?如果我想编写一台好的套接字服务器,我可以从中学到什么?

有帮助吗?

解决方案

如果您想编写插座服务器,那么一个好的起点是Dan Kegel的C10K文章,几年前:

http://www.kegel.com/c10k.html

我还发现Beej的网络编程指南非常方便:

http://beej.us/guide/bgnet/

最后,如果您需要出色的参考,那么W。RichardStevens等人的Unix网络编程。 Al。:

http://www.amazon.com/unix-network-programming-sockets-networking/dp/0131411551/ref=dp_ob_title_bk

无论如何,要回答您的问题,Apache和Nginx之间的主要区别是,Apache使用每个客户端使用一个线程与阻止I/O,而Nginx则单线读取无块I/O。 Apache的工作池确实减少了启动和命令过程的开销,但是在为多个客户端服务时,它仍然使CPU在多个线程之间进行切换。另一方面,nginx在一个线程中处理所有请求。当一个请求需要提出网络请求(例如后端)时,NGINX将回调附加到后端请求,然后在另一个活动的客户端请求上使用。实际上,这意味着它返回事件循环(epoll, kqueue, , 或者 select),并要求提供可以报告内容的文件描述符。请注意,主要事件循环中的系统调用实际上是一个阻止操作,因为直到一个文件描述符准备好读取或写作之前,没有什么可做的。

因此,这是Nginx和Tornado在为许多同时客户服务时有效的主要原因:只有一个进程(因此保存RAM),只有一个线程(因此将CPU从上下文开关中节省)。至于epoll,它只是选择的更高效的版本。如果有n个打开的文件描述符(套接字),则可以挑选出准备在O(1)而不是O(n)时间读取的文件描述符。实际上,nginx可以使用Select而不是Epoll,如果您将其编译为 --with-select_module 选项,我敢打赌,它仍然比Apache更有效。我不太熟悉Apache Internals,但是快速的GREP显示它确实使用了Select和Epoll-可能是当服务器正在侦听多个端口/接口或同时为单个客户端的后端请求时。

顺便说一句,我开始尝试编写基本套接字服务器,并想弄清楚Nginx如何如此高效。在浏览了NGINX源代码并阅读上面链接到上面的那些指南/书籍之后,我发现编写NGINX模块而不是我自己的服务器会更容易。因此,诞生了现在的《 Nginx模块开发指南》现在的内容:

http://www.evanmiller.org/nginx-modules-guide.html

(警告:该指南是针对NGINX 0.5-0.6编写的,API可能发生了变化。)如果您使用HTTP做任何事情,我会说nginx abot abot abot abot abot,因为它已经弄清了与愚蠢的客户打交道的所有毛茸茸的细节。例如,我为Fun创作的小型套接字服务器与所有客户端都很好 - 除了Safari,但我从未弄清楚原因。即使对于其他协议,NGINX也可能是正确的方法。该事件从协议中得出了很好的抽象,这就是为什么它可以代理HTTP和IMAP的原因。 NGINX代码基础非常组织良好,写得很好,有一个例外。在手工滚动协议解析器方面,我不会遵循它的领导;而是使用解析器生成器。我已经写了一些有关使用Parser Generator(Ragel)和Nginx的内容:

http://www.evanmiller.org/nginx-modules-guide-advanced.html#parsing

所有这些可能比您想要的更多的信息,但希望您会发现其中一些有用。

其他提示

是的,否。虽然他们都使用Epoll,但从技术上讲,他们俩都使用事件循环来处理请求。您可以找到有关哪些事件循环以及如何使用的更多信息 维基百科.

查看 libevent (使用 GEVENT, ,通常比龙卷风更快,更稳定)或 libev 用于实施。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top