sockets - 单线程 NGINX 如何处理如此多的连接?

标签 sockets asynchronous nginx epoll

NGNIX 使用 epoll 通知来了解套接字上是否有数据可供读取。

假设: 有两个向服务器发出的请求。 nginx 收到有关这两个请求的通知并开始:

  • 收到第一个请求

  • 解析ist header

  • 检查身材( body 尺寸)

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

  • 等等

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

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

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

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

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

如果 1. 是正确的,那么我不明白它如何在单个线程中实现。

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

请帮我理解一下。 谢谢

最佳答案

Nginx 不是单线程应用程序。它不会为每个连接启动一个线程,但会在启动期间启动多个工作线程。 http://www.aosabook.org/en/nginx.html 中很好地描述了 nginx 架构。 .

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

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

关于sockets - 单线程 NGINX 如何处理如此多的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29950133/

相关文章:

c - 错误 : request for member ‘sin_addr’ in something not a structure or union

http - 我可以在 nginx upstream 中同时使用 HTTP 和 HTTPS 吗?

java - 如何在单个 tomcat 实例中创建两个监听器?

java - 从Java中的服务器发送文件后,TCP无法接收文本消息

java - 实现 accept(SocketImpl s) 和对象复制

Node.js 和 Redis;等待循环完成

c# - 如何确保 Task.Delay 更准确?

python - 异步执行服务器端 Unix 脚本

javascript - Nginx、React、Node & Let's Encrypt……如何将 Nginx 指向我的 React 应用程序

apache - Mojolicious 用于学校项目 : shall I install Nginx, Apache 还是 Lighttpd?