单线程NGINX如何处理这么多连接



NGNIX使用epoll通知来知道套接字上是否有要读取的数据。

假设:有两个对服务器的请求。nginx会通知这两个请求,并开始:

  • 接收第一个请求

  • 解析列表头

  • 检查边界(车身尺寸)

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

  • 等等。

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

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

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

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

  3. 或者其他我不明白的事情。

如果1。是正确的,而我不明白它是如何在一个线程内实现的。

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

请帮我理解。感谢

Nginx不是一个单线程应用程序。它不会为每个连接启动一个线程,但在启动过程中会启动几个工作线程。nginx架构在http://www.aosabook.org/en/nginx.html.

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

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

最新更新