套接字 – 单线程NGINX如何处理这么多连接?
NGNIX使用epoll通知来了解套接字上是否有任何数据要读取. 假设: >收到第一个请求 nginx是单线程的,只能同时执行一个操作. 但是第二个请求会发生什么? >在解析第一个请求时,nginx会收到第二个请求吗? 如果1.是正确的,我不明白在单个线程中它是如何可能的. 如果2.是正确的,那么nginx如此之快?因为nginx按顺序处理所有传入的请求.在任何给定时间,只有一个请求处理是可能的. 请帮我理解. 最佳答案
Nginx不是单线程应用程序.它不会为每个连接启动一个线程,但它会在启动时启动多个工作线程. nginx架构在http://www.aosabook.org/en/nginx.html中有详细描述.
实际上,单线程非阻塞应用程序是单处理器硬件的最有效设计.当我们只有一个CPU并且应用程序完全无阻塞时,应用程序可以充分利用CPU功率.非阻塞应用程序意味着应用程序不会调用任何可能等待事件的函数.所有IO操作都是异步的.这意味着应用程序不会从套接字调用简单的read(),因为调用可能要等到数据可用.非阻塞应用程序使用某种机制如何通知应用程序数据可用,并且它可以调用read()而不会有调用等待某事的风险.因此理想的非阻塞应用程序只需要系统中一个CPU的一个线程.由于nginx使用非阻塞调用,因此多线程中的处理没有任何意义,因为没有CPU可以执行其他线程. 当网卡发出中断时,从网卡接收到缓冲区的实际数据在内核中完成.然后nginx在缓冲区中获取请求并处理它.在当前请求处理完成之前或者当前请求处理需要可能阻塞的动作(例如磁盘读取)之前,开始处理另一个请求没有意义. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |