首先明确一下该参数的意义:net.ipv4.ip_local_port_range表示本机作为客户端对外发起tcp/udp连接时所能使用的临时端口范围。
对于TCP连接,本机所能发起的tcp连接数受四元组(源地址*源端口*目标地址*目标端口)限制。
而对于UDP连接,本机所能发起的udp连接数则受二元组(源地址*源端口)限制。(此处借用二元组的概念,并不表示udp套接字的二元组标识)。
一个实际生产场景举例
我们知道,在使用nginx作反向代理服务器时,会作为客户端向后端负载发起连接,在不考虑最大打开文件数和其他配置影响的情况下:
作为TCP反向代理服务器:
本机IP为192.168.1.1,后端负载为tcp:192.168.1.2:80、tcp:192.168.1.2:80,net.ipv4.ip_local_port_range为40000-59999(即临时可用端口数为20000),那么Nginx所能维持的最大长连接数为1*20000*2*1=40000
作为UDP反向代理服务器:
本机IP为192.168.1.1,后端负载为udp:192.168.1.2:80、udp:192.168.1.2:80,net.ipv4.ip_local_port_range为40000-59999(即临时可用端口数为20000),那么Nginx所能维持的最大长连接数为1*20000=20000
如何突破端口数对Nginx连接数造成的限制
如果是tcp连接,根据公式:源地址*源端口*目标地址*目标端口,只需要简单的增加后端负载的数量即可。
如果是udp连接,根据公式:源地址*源端口,那么增加后端负载的数量是无意义的,可行的办法为增加源地址数量,即采用增加网卡或虚地址的方式提高可用源地址的数量,可以参考:https://www.nginx.com/blog/overcoming-ephemeral-port-exhaustion-nginx-plus/