Linux에서 사용 가능한 임시 포트 수를 어떻게 알 수 있습니까? 임시 포트 수를 확인하는 방법이 있습니까? 임시

Linux에 사용 가능한 임시 포트 수를 확인하는 방법이 있습니까? 임시 포트가 부족하여 “주소가 이미 사용 중입니다”라는 오류가 나타나는 경우가 있습니다. 컴퓨터를 다시 부팅하면이 문제가 해결되지만 문제가 발생하기 전에 미리 파악하는 것이 좋습니다.



답변

ephermal 포트 범위는에 지정되어 /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