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:超过65535个连接限制_Sockets_Nginx_Websocket_Getsockopt_Dragonfly Bsd - Fatal编程技术网

Sockets NGINX:超过65535个连接限制

Sockets NGINX:超过65535个连接限制,sockets,nginx,websocket,getsockopt,dragonfly-bsd,Sockets,Nginx,Websocket,Getsockopt,Dragonfly Bsd,与HTTP不同的是,websocket在从HTTP升级后保持长期连接 即使操作系统被调整为使用所有端口,仍然总共只有65536个端口。NGINX是否可能超过此限制 一个可能的解决方案是SO\u REUSEPORT,但它缺少文档——至少除了下面这一段之外,我找不到其他解决方案 NGINX 1.9.1版引入了一个新功能,可以使用 SO_REUSEPORT socket选项,该选项在更新版本的中可用 许多操作系统,包括DragonFly BSD和Linux(内核 版本3.9及更高版本)。此套接字选项允

与HTTP不同的是,websocket在从HTTP升级后保持长期连接

即使操作系统被调整为使用所有端口,仍然总共只有65536个端口。NGINX是否可能超过此限制

一个可能的解决方案是
SO\u REUSEPORT
,但它缺少文档——至少除了下面这一段之外,我找不到其他解决方案

NGINX 1.9.1版引入了一个新功能,可以使用 SO_REUSEPORT socket选项,该选项在更新版本的中可用 许多操作系统,包括DragonFly BSD和Linux(内核 版本3.9及更高版本)。此套接字选项允许使用多个套接字 在相同的IP地址和端口组合上侦听。那么内核呢 负载平衡跨套接字的传入连接

因此,NGINX调用以接受入站连接

accept()系统调用用于基于连接的套接字类型 (SOCK_流,SOCK_SEQPACKET)。它提取第一个连接 请求侦听套接字的挂起连接队列, sockfd,创建一个新的已连接套接字,并返回一个新文件 引用该套接字的描述符。新创建的套接字不可用 处于倾听状态。原始套接字sockfd不受 这个电话


新套接字将使用端口吗?如果是,如何超过65535个连接限制?

您收到的评论是正确的:


TCP连接由4元组(src_addr、src_port、dst_addr、dst_port)定义。如果客户端使用不同的IP地址和/或源端口,则可以将服务器连接到同一端口上的65536个以上客户端。示例:服务器IP为0.0.0.1,侦听端口80。所有4元组都可以是(*,*,0.0.0.1,80)。只要不存在相同的4元组,服务器就可以在其内存允许的情况下在端口80上建立尽可能多的连接玉米秸秆12月4日15日2:36

然而,在评估是否超出限制时,您还必须考虑NGNIX不仅仅是一个服务器(具有调用和系统调用来接管端口,并随后调用一个无限循环),但它也可能是上游服务器的客户端。(根据需要调用并连接到8080等端口的上游)

请注意,然而,对于其服务器上下文而言,TCP端口将无法用尽(因为服务器在其所有连接中使用单个端口,例如端口80)根据配置,客户端上的TCP端口耗尽是可能的。您还必须考虑到,在客户端在连接上做了一个操作之后,大约60秒左右的时间(以确保如果任何迟到的数据包都能通过,那么系统将知道如何处理它们)。 然而,尽管如此,请注意,至少在中,to与
65535
困境完全无关——它只是在内核和在内核下运行的应用程序之间具有可伸缩多处理器支持的一个构建块:

我在36核AWS实例上运行了一个带有4个NGINX Worker的wrk基准测试。为了消除网络影响,我在localhost上运行了client和NGINX,并让NGINX返回字符串OK而不是文件。我比较了三种NGINX配置:默认配置(相当于接受\u mutex on),关闭accept_mutex,使用reuseport。如图所示,reuseport将每秒请求数增加2到3倍,并减少延迟和延迟的标准偏差


至于您的潜在问题,传出问题的解决方案可能是,在出现问题时不通过TCP使用后端,和/或通过et al指令使用额外的本地地址(和/或限制可以与后端建立的TCP连接的数量).TCP连接由4元组
定义(src_addr、src_port、dst_addr、dst_port)
。如果客户端使用不同的IP地址和/或源端口,则可以将服务器连接到同一端口上的65536个以上客户端。例如:服务器IP为0.0.0.1,侦听端口80。然后,所有4元组都可以
(*, *, 0.0.0.1, 80)
。只要不存在相同的4元组,服务器就可以在其内存允许的情况下在端口80上有尽可能多的连接。谢谢,我更新了问题,使其更清楚。因此由
accept
创建的新套接字不会使用其他端口?不,它不会切换到使用其他端口。谢谢accept,+1回答您的问题;可以吗我的答案也有一个?