Linux'ta, kaç geçici bağlantı noktasının kullanılabilir olduğunu nasıl anlayabilirim?


17

Linux'ta kaç tane geçici portun kaldığını kontrol etmenin bir yöntemi var mı? Geçici bağlantı noktalarının bitmesi nedeniyle zaman zaman "Adres zaten kullanımda" hataları görüyorum. Bir makinenin yeniden başlatılması bunu çözer, ancak gerçekleşmeden önce yakalamak daha iyi olur.


Bunun gibi hatalara çarpıyorsanız, ya bir iş için doğru yazılımı ya da mimariyi kullanmadan sistemi kötüye kullandığınızı ya da yazılımınızın hatalı veya yanlış yapılandırıldığını öneririm. Belki zaman aşımlarınız uygulamanız için çok uzun veya bir şey bağlantıları kullanmadan açık bırakıyor?
Caleb

1
İşletim sistemi varsayılanlarının ötesinde ek geçici bağlantı noktaları gerektiren birçok geçerli uygulama vardır.
GregB

Yanıtlar:


26

Ephermal bağlantı noktası aralığı /proc/sys/net/ipv4/ip_local_port_range. Muhtemelen 16k - 64k arasında çalışacak şekilde genişletebilirsiniz.

Düğmesini kullanarak açık bağlantı sayısını görebilirsiniz netstat -an. Çok sayıda bağlantı açar ve kapatırsanız soketler TIME_WAIT durumunda takılı kalabilir. Bazı yerlerde bu kaçınılmazdır, ancak bu durumda bir bağlantı havuzuna ihtiyacınız olup olmadığını düşünmeniz gerekebilir.

TIME_WAIT sorunsa, bağlantı devir hızını ayarlamak net.ipv4.tcp_tw_reuse/ net.ipv4.tcp_tw_recyclehızlandırmak için ayarlayabilirsiniz .


+1, bu adama kesin ayrıntıları vermek için zaman ayırdığınız için teşekkürler.
Caleb

32800 ile 61000 arasında bir yelpazemiz var. Sadece bunlar kullanıldıktan sonra işletim sisteminin onları tekrar kullanmayacağını görüyoruz. Bu beklenen davranıştır, ancak en son kullanılabilir bağlantı noktasına ulaştığında işletim sisteminin başlangıçta yeniden başlamasını beklerim. Ancak bu gerçekleşmiyor gibi görünüyor. Ayrıca, sadece not etmek gerekirse, bu son derece düzenli bir olay değildir. Aralıklı ama çok sayıda sunucumuz var.
JMc


1
RFC /proc/sys/net/ipv4/ip_local_port_range 6335'e uymak için 49152-65535 alt kümesi olmalıdır. Bu nedenle, aralığın alt ucunun 49152'den daha düşük bir şeye düşürülmesi belirli bir risk taşır.
kasperd

Eğer umutsuz ve ne yaptığını tam olarak bilmiyorsan asla net.ipv4.tcp_tw_recycle veya net.ipv4.tcp_tw_reuse kullanmayın. Hizmetinizi potansiyel ekstrüzyon sorununa maruz bırakıyorsunuz.
Kiwy

3

Bu sınırın benzersiz (kaynak IP, eş IP, eş bağlantı noktası) grup başına uygulandığını unutmayın. Bu nedenle, bu grupların çıktılarını netstat/ gruplarına göre gruplandırmanız ve ssher grubun bağlantı sınırına ne kadar yakın olduğunu kontrol etmeniz gerekecektir.

Bu yayın , bu gruplamayı nasıl daha ayrıntılı yapabileceğinizi açıklar. Her grubun Ruby'deki sınıra ne kadar yakın olduğunu kontrol etmek için ssçıktıyı aşağıdaki gibi işleyebilirsiniz :

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.