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