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在缓冲区中获取请求并处理它.在当前请求处理完成之前或者当前请求处理需要可能阻塞的动作(例如磁盘读取)之前,开始处理另一个请求没有意义.