Nginx的速度,以及如何复制它

时间:2011-11-14 22:27:53

标签: nginx erlang

我从学术角度而不是实际角度对此感兴趣;我不打算创建一个生产网络服务器来与nginx竞争。我想知道的是nginx究竟是如此之快。最热门的谷歌回复是this线程,但它只链接到一个神秘的幻灯片和不同的io策略的一般覆盖。所有其他结果似乎只是简单描述了nginx的速度,而不是原因。

我尝试构建一个简单的erlang服务器来尝试与nginx竞争,但无济于事; nginx赢了。我的所有服务器都为每个请求生成一个新进程,使用该进程将文件读取到套接字,然后关闭文件并终止该线程。这并不复杂,但考虑到erlang的轻量级进程和底层的aio结构,我认为它会竞争,但是在压力测试中,nginx仍能以300毫秒的平均值获胜。

什么是nginx这样做,我的简单服务器不是?我的第一个想法是将文件保存在主内存中,而不是在请求之间抛出它们,但文件系统缓存已经这样做了,所以我认为它不会产生那么大的差别。我错了吗?或者还有其他我缺少的东西?

4 个答案:

答案 0 :(得分:8)

一旦我告诉它以二进制模式而不是列表模式读取文件,我的小测试服务器与nginx相当竞争。

我认为,对于不熟悉erlang和erlang服务器设计的人来说,在本主题的其余部分进行的大量讨论可能会让人感到困惑。我不想删除该线程,因为其中有关于nginx的良好信息(我不能,它已经有了答案),但我鼓励任何人研究制作基于erlang的服务器进行一些研究并写了很多测试,而不仅仅是你在这里阅读的内容。

答案 1 :(得分:0)

我要保持这一点,因为我不是这个主题的专家。但是使Nginx快速运行的两个最重要的事情是它使用事件轮询并且不会阻止。

事件轮询本质上意味着一个进程可以处理许多连接,这是至关重要的,因为产生进程的时间非常昂贵。但是,不应将事件轮询与线程编程混淆。如果你想了解更多关于这个的信息,那么比我写的更聪明的人。

第二个最重要的是你不会阻止Nginx进程。如果执行阻止操作,则所有其他连接将排队等待您完成。如果每个连接阻塞,那么性能将很快降至零。

Nginx做得远远不止于此,例如最小化上下文切换。然而,这些对我来说远远超出了我的专业知识,无法对其进行评论。

答案 2 :(得分:0)

Nginx是用C语言编写的,因此它被编译为本机机器语言。 Erlang有自己的VM。仅这一点意味着,在Erlang模块必须经历的字节码解释器的情况下,使用Erlang程序永远不会匹配精心设计的C程序的性能。

尽管Erlang基于轻量级进程并且可以在分布式体系结构上进行扩展,但它永远无法匹配用本机语言编写的近实时处理系统的性能,在本例中是Nginx。

答案 3 :(得分:-4)

嗯,你的架构无可救药地低效。例如,考虑是否需要对50个连接中的每个连接进行一些工作。您需要多少个上下文切换?假设您正在处理的50个连接已准备好进行I / O.只需要发现这个,您需要多少次调用系统?