FIN_WAIT2 durumundaki bağlantılar neden Linux çekirdeği tarafından kapatılmıyor?


11

Uzun süredir devam eden bir süreçte, kube-proxy'nin Kubernetes'in bir parçası olması sorunum var .

Sorun, zaman zaman bir bağlantının FIN_WAIT2 durumunda kalmasıdır.

$ sudo netstat -tpn | grep FIN_WAIT2
tcp6       0      0 10.244.0.1:33132        10.244.0.35:48936       FIN_WAIT2   14125/kube-proxy
tcp6       0      0 10.244.0.1:48340        10.244.0.35:56339       FIN_WAIT2   14125/kube-proxy
tcp6       0      0 10.244.0.1:52619        10.244.0.35:57859       FIN_WAIT2   14125/kube-proxy
tcp6       0      0 10.244.0.1:33132        10.244.0.50:36466       FIN_WAIT2   14125/kube-proxy

Bu bağlantılar zamanla birikerek işlemin hatalı davranmasını sağlar. Kubernetes hata izleyicisine zaten bir sorun bildirdim, ancak bu tür bağlantıların neden Linux çekirdeği tarafından kapatılmadığını anlamak istiyorum.

FIN_WAIT2 durumundaki belgelerine göre (tcp_fin_timeout araması) bağlantı X saniyesinden sonra çekirdek tarafından kapatılmalı, burada X okunabilir / proc. Makinemde 60 olarak ayarlandı:

$ cat /proc/sys/net/ipv4/tcp_fin_timeout
60

bu yüzden doğru anlarsam bu tür bağlantılar 60 saniye kapatılmalıdır. Ancak durum böyle değil, saatlerce böyle bir durumda kalıyorlar.

Ayrıca FIN_WAIT2 bağlantılarının oldukça sıra dışı olduğunu anlasam da (ana bilgisayarın bağlantının uzak ucundan bazı ACK'yi beklediği anlamına gelir) Bu bağlantıların neden sistem tarafından "kapatılmadığını" anlamıyorum .

Bu konuda yapabileceğim bir şey var mı?

İlgili işlemin yeniden başlatılmasının son çare olduğunu unutmayın.


1
Bu arada, FIN-wait2 içinde, bağlantı olduğu değil (biz FIN-WAIT1 değildir yüzden zaten kabul edilmiştir gönderdi FIN) bir ACK bekliyor. Bunun yerine, diğer uç hala sınırsız miktarda veri gönderme seçeneğine sahiptir.
Hagen von Eitzen

Yanıtlar:


14

Çekirdek zaman aşımı yalnızca bağlantı yetimsiz olduğunda geçerlidir. Bağlantı hala bir sokete bağlıysa, bu sokete sahip olan program bağlantının kapanmasının zamanlamasından sorumludur. Muhtemelen aradı shutdownve bağlantının temiz bir şekilde kapanmasını bekliyor. Uygulama, kapatma işleminin tamamlanmasını istediği sürece bekleyebilir.

Tipik temiz kapatma akışı şu şekildedir:

  1. Uygulama bağlantıyı kapatmaya karar verir ve bağlantının yazma tarafını kapatır.

  2. Uygulama diğer tarafın bağlantının yarısını kapatmasını bekler.

  3. Uygulama, diğer tarafın bağlantıyı kapattığını algılar ve soketini kapatır.

Uygulama istediği sürece 2. adımda bekleyebilir.

Uygulama zaman aşımına ihtiyaç duyuyor gibi görünüyor. Bağlantıyı kesmeye karar verdiğinde, diğer tarafın makul bir süre sonra temiz bir kapanma yapmasını beklemekten vazgeçmelidir.


Böyle bir zaman aşımının uygulanıp uygulanmadığını görmek için Kubernetes geliştiricileri ile bu bilgileri kontrol edeceğim. Doğruladıktan sonra cevabı kabul edeceğim. Yine de hızlı yanıt için teşekkürler.
Adam Romanek

Cevabınızı daha ayrıntılı olarak anlamak istiyorum. Artık bir bağlantının ne olduğunu açıklar mısınız?
Adam Romanek

1
@AdamRomanek Yetimsiz bir bağlantı, ilişkili soketleri olmayan, yani yalnızca çekirdeğin kendisinden erişilebilen ve hiçbir işlemin işlem yapamayacağı bağlantıdır.
David Schwartz

Bu yardımcı olur ... " blog.cloudflare.com/…
John Greene

2

Soket kapalıysa () ancak henüz kapatılmamışsa (), soket FIN_WAIT2 durumunda kalacaktır. Ve uygulama hala dosya tanımlayıcıya sahip olduğundan, çekirdek temizlemek için uğraşmaz.


Bu, kabul edilen cevapta zaten belirtilmiştir.
RalfFriedl

Özellikle close () çağrılmadığını ekledim.
L. Yan
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.