加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > Nginx > 正文

套接字 – 单线程NGINX如何处理这么多连接?

发布时间:2020-12-13 21:39:04 所属栏目:Nginx 来源:网络整理
导读:NGNIX使用epoll通知来了解套接字上是否有任何数据要读取. 假设: 有两个服务器请求. 关于这两个请求,nginx被通知并开始: 收到第一个请求 解析ist标题 检查boudary(体型) 将第一个请求发送到上游服务器 等 nginx是单线程的,只能同时执行一个操作. 但是第二个

NGNIX使用epoll通知来了解套接字上是否有任何数据要读取.

假设:
有两个服务器请求.
关于这两个请求,nginx被通知并开始:

>收到第一个请求
>解析ist标题
>检查boudary(体型)
>将第一个请求发送到上游服务器
>等

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

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

>在解析第一个请求时,nginx会收到第二个请求吗?
>或者它在第一次完成后开始处理第二个请求?
>或者其他我不理解的东西.

如果1.是正确的,我不明白在单个线程中它是如何可能的.

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

请帮我理解.
谢谢

最佳答案
Nginx不是单线程应用程序.它不会为每个连接启动一个线程,但它会在启动时启动多个工作线程. nginx架构在http://www.aosabook.org/en/nginx.html中有详细描述.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读