Trên Linux, làm thế nào tôi có thể biết có bao nhiêu cổng phù du còn lại?


17

Có một phương pháp nào trong Linux để kiểm tra xem có bao nhiêu cổng phù du không? Thỉnh thoảng tôi thấy lỗi "Địa chỉ đã được sử dụng" là kết quả của việc hết các cổng phù du. Khởi động lại máy sẽ giải quyết vấn đề này nhưng sẽ tốt hơn nếu bắt nó trước khi nó xảy ra.


Nếu bạn gặp phải lỗi như vậy, tôi sẽ đề nghị rằng bạn đang lạm dụng hệ thống bằng cách không sử dụng đúng phần mềm hoặc kiến ​​trúc cho công việc hoặc phần mềm của bạn hoạt động sai hoặc bị định cấu hình sai. Có lẽ thời gian chờ của bạn quá dài cho ứng dụng của bạn hoặc một cái gì đó đang để kết nối mở mà không sử dụng chúng?
Caleb

1
Có nhiều ứng dụng hợp lệ yêu cầu các cổng phù du bổ sung ngoài mặc định của hệ điều hành.
GregB

Câu trả lời:


26

Phạm vi cổng ephermal được chỉ định trong /proc/sys/net/ipv4/ip_local_port_range. Bạn có thể mở rộng nó để chạy từ 16k đến 64k.

Bạn có thể thấy số lượng kết nối mở bằng cách sử dụng netstat -an. Ổ cắm có thể bị kẹt trong trạng thái TIME_WAIT nếu bạn đang mở và đóng nhiều kết nối. Ở một số nơi điều này là không thể tránh khỏi, nhưng bạn có thể cần phải xem xét nếu bạn cần một nhóm kết nối nếu đây là trường hợp.

Nếu TIME_WAIT là sự cố, bạn có thể đặt net.ipv4.tcp_tw_reuse/ net.ipv4.tcp_tw_recycleđể tăng tốc độ kết nối.


+1, cảm ơn vì đã dành thời gian để cung cấp cho anh chàng này chi tiết chính xác.
Caleb

Chúng tôi có phạm vi từ 32800 đến 61000. Chúng tôi chỉ thấy rằng một khi những thứ này đã được sử dụng, HĐH sẽ không sử dụng chúng nữa. Đây là hành vi dự kiến, nhưng tôi hy vọng HĐH sẽ bắt đầu lại từ đầu khi nó đến cổng có sẵn cuối cùng. Điều này dường như không xảy ra mặc dù. Ngoài ra, chỉ cần lưu ý, đây không phải là một sự xuất hiện thường xuyên. Nó không liên tục nhưng chúng tôi có một số lượng lớn máy chủ.
JMc


1
Để tuân thủ RFC 6335 /proc/sys/net/ipv4/ip_local_port_range cần phải là một tập hợp con của 49152-65535. Vì vậy, việc giảm đầu dưới của phạm vi xuống bất cứ thứ gì dưới 49152 sẽ có rủi ro nhất định.
kasperd

không bao giờ sử dụng net.ipv4.tcp_tw_recycle cũng như net.ipv4.tcp_tw numuse trừ khi bạn tuyệt vọng và biết chính xác những gì bạn đang làm. Bạn đang phơi bày dịch vụ của mình cho vấn đề cực đoan tiềm năng.
Kiwy

3

Hãy nhớ rằng giới hạn này áp dụng cho mỗi bộ dữ liệu duy nhất (IP nguồn, IP ngang hàng, cổng ngang hàng). Do đó, bạn sẽ cần nhóm đầu ra của netstat/ sstheo từng bộ dữ liệu này và kiểm tra xem mỗi nhóm gần với giới hạn kết nối như thế nào.

Bài đăng này giải thích làm thế nào bạn có thể làm nhóm này chi tiết hơn. Để kiểm tra mức độ gần nhau của mỗi nhóm trong giới hạn trong Ruby, bạn có thể xử lý ssđầu ra như:

#!/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.