在对于繁忙的网络服务器,如代理服务器或负载平衡器,我们可能需要增加网络端口范围来增强它的处理能力。
在Linux上,有一个sysctl参数ip_local_port_range
,可用于定义网络连接可用作其源(本地)端口的最小和最大端口的限制,同时适用于TCP和UDP连接。
查看当前系统开放端口范围,命令如下:
代码语言:javascript复制# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000
要么:
代码语言:javascript复制# sysctl net.ipv4.ip_local_port_rangenet.ipv4.ip_local_port_range = 32768 61000
如上命令显示"最小最大值",因此新连接的本地端口将介于32768和61000之间,默认情况下28232个随机端口,看起来很多,但在繁忙的流量服务器的时候可能很容易达到这个限制。
对于繁忙的流量服务器,可以如下操作增加随机端口范围。
代码语言:javascript复制# sysctl -w net.ipv4.ip_local_port_range="15000 64000"net.ipv4.ip_local_port_range = 15000 64000
或者直接通过使用echo直接传递值给/proc目录下的文件。
代码语言:javascript复制echo "15000 64000" > /proc/sys/net/ipv4/ip_local_port_range
如果想要持久生效,并且重启不会失效,请将配置保存在/etc/sysctl.conf
的配置文件中。
# cat /etc/sysctl.d/net.ipv4.ip_local_port_range.confnet.ipv4.ip_local_port_range = 15000 65000
要了解服务器当前处理的会话数,请使用如下命令查看:
代码语言:javascript复制# ss -sTotal: 2933 (kernel 3131)
TCP: 43915 (estab 2655, closed 41080, orphaned 159, synrecv 0, timewait 41080/0), ports 30347Transport Total IP IPv6* 3131 - -
RAW 0 0 0
UDP 17 11 6
TCP 2835 2832 3
INET 2852 2843 9
FRAG 0 0 0# netstat -anp | more...
tcp 0 0 10.50.1.6:41205 10.50.1.10:80 TIME_WAIT -
tcp 0 0 10.50.1.6:42515 10.50.1.10:80 TIME_WAIT -
tcp 0 0 10.50.1.6:59845 10.50.1.10:80 TIME_WAIT -
请注意增加TCP端口范围,但有限制!
TIPS: 如果服务器有较多程序开放端口,请注意程序的端口开放范围,以避免随机端口跟设置的端口范围冲突。
比如如下场景:
代码语言:javascript复制1. 多服务程序在一台机器,会造成有的服务启动监听端口跟系统开放的端口范围冲突2. 比如有的服务随机端口去连接zookeeper,如果这个随机端口跟本机服务监听的端口冲突的话,就造成次服务连接zookeeper失败,从而会造成你意想不到的服务故障发生
如上的一些场景尽量避免,可以根据业务情况设置不同的开放端口范围。