在 Linux 上,如何知道还有多少个临时端口可用?

在 Linux 上,如何知道还有多少个临时端口可用?

Linux 中是否有方法可以检查还有多少个临时端口可用?我偶尔会看到由于临时端口用尽而导致的“地址已在使用中”错误。重新启动机器可以解决此问题,但最好在发生之前就发现它。

答案1

临时端口范围在 中指定/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来加快连接周转。

答案2

请记住,此限制适用于每个唯一(源 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

相关内容