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


17

Linux中是否有一种方法可以检查还有多少个临时端口可用?由于临时端口用尽,我偶尔会看到“地址已在使用中”错误。重新启动计算机可以解决此问题,但最好在发生之前将其捕获。


如果您遇到类似的错误,我建议您要么没有通过使用正确的软件或体系结构来工作来滥用系统,要么您的软件行为异常或配置错误。也许您的超时对于您的应用程序来说太长了,还是某些东西在不使用连接的情况下使连接保持打开状态?
Caleb

1
有许多有效的应用程序需要操作系统默认值以外的其他临时端口。
GregB

Answers:


26

外围端口范围在中指定/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加快连接更新。


+1,感谢您抽出宝贵时间为这个家伙提供详细信息。
Caleb

我们的范围是32800到61000。我们只是发现,一旦使用了它们,操作系统将不会再次使用它们。这是预期的行为,但是我希望操作系统一旦到达最后一个可用端口,便会从头开始重新启动。不过,这似乎没有发生。另外,仅需注意,这不是一个很大的常规事件。它是间断的,但我们确实有大量的服务器。
JMc 2011年


1
为了符合RFC 6335 /proc/sys/net/ipv4/ip_local_port_range,它必须是49152-65535的子集。因此,将范围的下限减小到小于49152确实会带来一定的风险。
kasperd

切勿使用net.ipv4.tcp_tw_recycle或net.ipv4.tcp_tw_reuse,除非您绝望并确切知道自己在做什么。您会将服务暴露给潜在的极端问题。
Kiwy

3

请记住,此限制适用于每个唯一(源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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.