it-swarm-tr.com

FIN_WAIT1 durumundaki soketlerden nasıl kurtulurum?

Öldürmem gereken bir işlemle engellenen bir limanım var. (çökmüş küçük bir telnet arka plan programı). İşlem başarıyla öldürüldü, ancak bağlantı noktası hala 'FIN_WAIT1' durumunda. Bundan çıkmıyor, bunun için zaman aşımı 'on yıl' olarak ayarlanmış gibi görünüyor.

Bağlantı noktasını serbest bırakmanın tek yolu, tüm makineyi yeniden başlatmaktır, bu da yapmak istemediğim bir şeydir.

$ netstat -tulnap | grep FIN_WAIT1 
tcp        0  13937 10.0.0.153:4000         10.0.2.46:2572          FIN_WAIT1  -

Herkes yeniden başlatmadan bu bağlantı noktasının engelini nasıl kaldırabilirim biliyor mu?

20
Gert M
# record what tcp_max_orphans's current value
original_value=$(cat /proc/sys/net/ipv4/tcp_max_orphans)

#set the tcp_max_orphans to 0 temporarily
echo 0 > /proc/sys/net/ipv4/tcp_max_orphans

# watch /var/log/messages
# it will split out "kernel: TCP: too many of orphaned sockets"
# it won't take long for the connections to be killed

# restore the value of tcp_max_orphans whatever it was before. 
echo $original_value > /proc/sys/net/ipv4/tcp_max_orphans

# verify with 
netstat -an|grep FIN_WAIT1
19
IdaWong

Zaman aşımını /proc/sys/net/ipv4/tcp_fin_timeout İle ayarlayabilmeniz gerekir.

Soketi manuel olarak temizlemenin hiçbir yolu yok gibi görünüyor.

7
innaM

Tcp_Orphan_retries ayarının, sunucusuz bir bağlantı noktası serbest bırakılmadan önce kaç denemenin yapılacağını kontrol ettiği görülmektedir. Burada 0, 1 olarak ayarlandıktan sonra portlar gitmişti.

HTH

6
user64877

/proc/sys/net/ipv4/tcp_fin_timeout, FIN-WAIT-2 durumunun zaman aşımıdır, FIN-WAIT-1 değil. Tcpkill rotası ile gitmelisiniz ya da SO tarafından öldürmeye zorlamak için /proc/sys/net/ipv4/tcp_keepalive_* Altındaki tutma zamanlarıyla oynamaya çalışabilirsiniz.

5

Bu adımları root ID altında çalıştırmak ve benim için temizlendi:

Bir değişkeni değiştirmek için çekirdek ayarını yakalayın

$ orig_orphans=$(sysctl -a|grep tcp_max_orph|cut -f3 -d' ')

Maksimum yetimleri geçici olarak 0 olarak ayarlayın

$ sysctl -w net.ipv4.tcp_max_orphans=0

Sorunlu bağlantı noktasının artık kullanılmadığından emin olun

$ netstat -np|grep 9716

Biraz bekleyin ve yukarıdaki komut satır döndürmeyene kadar yukarıdaki adımı tekrarlayın

Tcp_max_orphans çekirdek parametresini yukarıdaki değişkenin orijinal değerine sıfırlayın

$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans
2
Rad Mandapati

FIN_WAIT1

Yerel makinedeki uygulama bağlantıyı kapattı. Bunun göstergesi uzak makineye gönderildi.

Uygulamanız bağlantının yanını kapattı, soket şimdi uzak tarafın bu kapatmayı onaylamasını bekliyor. Bu soketlerin çoğunun FIN_WAIT1 içinde tutulmasıyla ilgili bir sorununuz varsa, yukarıdaki Manni'nin tavsiyelerine uymalısınız.

1
Dave Cheney

Linux çekirdeği> = 4.9'da iproute2'den ss komutunu -K tuşuyla kullanabilirsiniz

ss -K dst 192.168.1.214 dport = 49029 çekirdek, CONFIG_INET_DIAG_DESTROY seçeneği etkin olarak derlenmelidir.

https://unix.stackexchange.com/a/511691/43898 aracılığıyla

0
eri