gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:36:15 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com