Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 单线程NGINX如何处理如此多的连接?_Sockets_Asynchronous_Nginx_Epoll - Fatal编程技术网

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

Sockets 单线程NGINX如何处理如此多的连接?,sockets,asynchronous,nginx,epoll,Sockets,Asynchronous,Nginx,Epoll,NGNIX使用epoll通知来知道套接字上是否有任何数据要读取 假设: 有两个对服务器的请求。 nginx被告知这两个请求,并开始: 收到第一个请求 解析ist头 检查boudary(车身尺寸) 将第一个请求发送到上游服务器 等等 nginx是单线程的,一次只能执行一个操作 但是第二个请求会发生什么呢 nginx在解析第一个请求时是否接收到第二个请求 还是在完成第一个请求后开始处理第二个请求 或者其他我不明白的事情 如果1。是正确的,但我不明白在一个线程中是如何实现的 如果2。比nginx的

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

假设: 有两个对服务器的请求。 nginx被告知这两个请求,并开始:

  • 收到第一个请求

  • 解析ist头

  • 检查boudary(车身尺寸)

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

  • 等等

nginx是单线程的,一次只能执行一个操作

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

  • nginx在解析第一个请求时是否接收到第二个请求

  • 还是在完成第一个请求后开始处理第二个请求

  • 或者其他我不明白的事情

  • 如果1。是正确的,但我不明白在一个线程中是如何实现的

    如果2。比nginx的速度还快吗?因为nginx按顺序处理所有传入的请求。在任何给定时间,只能处理一个请求

    请帮助我理解。
    谢谢

    Nginx不是单线程应用程序。它不会为每个连接启动一个线程,但会在启动期间启动多个工作线程。nginx体系结构在中有很好的描述

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


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

    可能与此相关:unix套接字被证明比使用TCP慢。还有一件事:nginx是单踏板的,但创建的工人很少,默认情况下为4。您的问题是关于一个特定工人内部发生的情况吗?请参阅我的答案以了解解释: