Answers:
外围端口范围在中指定/proc/sys/net/ipv4/ip_local_port_range
。您可以将其范围从16k扩展到64k。
您可以使用来查看打开的连接数netstat -an
。如果您打开和关闭大量连接,套接字可能会停留在TIME_WAIT状态。在某些地方这是不可避免的,但是在这种情况下,您可能需要考虑是否需要连接池。
如果是TIME_WAIT,可以设置net.ipv4.tcp_tw_reuse
/ net.ipv4.tcp_tw_recycle
加快连接更新。
请记住,此限制适用于每个唯一(源IP,对等IP,对等端口)元组。因此,您需要按每个元组对netstat
/ 的输出进行分组ss
,并检查每个组与连接限制的接近程度。
这篇文章详细说明了如何进行分组。要检查每个组与Ruby中的限制有多接近,您可以ss
像这样处理输出:
#!/usr/bin/ruby
first_port, last_port = IO.read('/proc/sys/net/ipv4/ip_local_port_range').split.map(&:to_i)
ephemeral_port_max = last_port - first_port + 1
ephemeral_port_warning = ephemeral_port_max / 3 * 2
conns = `ss --numeric --tcp state connected "( sport >= :#{first_port} and sport <= :#{last_port} )"`
groups = Hash.new(0)
conns.lines.each do |conn|
state, recvq, sendq, local, peer = conn.split
local_ip, local_port = local.split(':')
group = [local_ip, peer]
groups[group] += 1
end
groups_requiring_warning =
groups.select { |k, v| v > ephemeral_port_warning }
.to_a
.sort_by { |v1, v2| v1[1] <=> v2[1] } # Sort groups in descending order of number of connections
groups_requiring_warning.each do |group, used_port_count|
puts "Connections from #{group[0]} to #{group[1]} "\
"have used #{used_port_count} ephemeral ports out of #{ephemeral_port_max} max"\
"(#{((used_port_count.to_f / ephemeral_port_max) * 100).round(2)}% used)"
end