2015-04-29 45 views
3

NGNIX使用epoll通知来了解套接字上是否有数据要读取。我们假设: 有两个请求到服务器。 nginx的是notificated了解这个两个请求,并且开始:单线程NGINX如何处理如此多的连接?

  • 接收第一请求

  • 解析IST头

  • 检查boudary(车身尺寸)

  • 发送向上游服务器的第一请求

nginx是单线程的,只能同时执行一个操作。

但第二个请求会发生什么?

  1. nginx在解析第一个请求时是否收到第二个请求?

  2. 或者在第一次完成后开始处理第二个请求?

  3. 或其他我不明白的东西。

如果1.是正确的比我不明白如何在一个单一的线程内是可能的。

如果2.是正确的比nginx怎么会这么快?因为nginx会按顺序处理所有传入的请求。在任何时候,只有一个请求处理是可能的。

请帮我理解。 谢谢

+0

可能相关:unix套接字比使用TCP更慢。另一件事:nginx是单线程的,但创建的工作人员很少,默认情况下4,你的问题是关于一个特定的工人内部发生了什么? –

+0

请参阅我的答案以获得解释:http://stackoverflow.com/a/19324665/362536 – Brad

回答

1

Nginx不是一个单线程的应用程序。它不会为每个连接启动线程,但会在启动过程中启动多个工作线程。 nginx体系结构在http://www.aosabook.org/en/nginx.html中有很好的描述。

实际上,单线程无阻塞应用程序是单处理器硬件最高效的设计。当我们只有一个CPU并且应用程序完全没有阻塞时,应用程序可以充分利用CPU的功率。非阻塞应用程序意味着应用程序不会调用任何可能等待事件的函数。所有的IO操作都是异步的。这意味着应用程序不会从套接字调用简单的read(),因为该调用可能会等待数据可用。非阻塞应用程序使用一些机制来告知应用程序数据是否可用,并且它可以调用read()而没有呼叫等待的风险。所以理想的非阻塞应用程序只需要一个系统中的一个CPU的线程。由于nginx使用非阻塞调用,所以多线程中的处理没有意义,因为不会有CPU执行其他线程。

当网卡发出中断时,从网卡接收到缓冲区的实际数据在内核中完成。然后nginx在缓冲区中获取请求并处理它。直到当前的请求处理完成或直到当前的请求处理需要可能阻止(例如磁盘读取)的动作时,开始处理另一个请求没有任何意义。