Linuxでは、使用可能な一時ポートの数をどのように確認できますか?


17

Linuxで使用可能な一時ポートの数を確認する方法はありますか?エフェメラルポートを使い果たした結果、「Address already in use」エラーが表示されることがあります。マシンを再起動すると解決しますが、発生する前にキャッチする方が良いでしょう。


そのようなエラーが発生した場合は、ジョブに適切なソフトウェアまたはアーキテクチャを使用しないことでシステムを乱用しているか、ソフトウェアの動作が正しくないか、設定が間違っていることをお勧めします。おそらく、タイムアウトがアプリケーションに対して長すぎるか、何かを使用せずに接続を開いたままにしているのでしょうか?
カレブ

1
OSのデフォルトを超える追加の一時ポートを必要とする多くの有効なアプリケーションがあります。
GregB

回答:


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、この男に正確な詳細を説明してくれてありがとう。
カレブ

32800から61000の範囲があります。これらが使用されると、OSはそれらを再び使用しないことがわかります。これは予想される動作ですが、OSが最後の使用可能なポートに到達すると、最初から再び起動することを期待しています。しかし、これは起こらないようです。また、注意してください、これは非常に定期的な発生ではありません。断続的ですが、多数のサーバーがあります。
JMc


1
RFC 6335に 準拠するには/proc/sys/net/ipv4/ip_local_port_range、49152-65535のサブセットである必要があります。したがって、範囲の下限を49152未満に下げると、特定のリスクが生じます。
カスペルド

net.ipv4.tcp_tw_recycleやnet.ipv4.tcp_tw_reuseを絶対に使用しないでください。サービスを潜在的な極端な問題にさらしています。
キーウィ

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.