Soru TIME_WAIT dosya tanımlayıcılarını kullanıyor?


Birçok TCPIP ve Web tunning guide'da, maksimum dosya tanıtıcı sayısını artırmanızı önerir "Çok fazla açık dosya" hatası alırken

ancak "lsof -i" çıktılarında TIME_WAIT göremiyorum

TIME_WAIT dosyasının dosya tanıtıcıları tükettiğini bilen var mı? ya da değil


6
2017-09-10 15:30


Menşei




Cevaplar:


Dosya tanıtıcı, uygulamadan soketten okuma / yazma için kullanılır. Böylece uygulama kapatırsa (), dosya tanıtıcı hemen serbest bırakılır.

Diğer taraftan, uygulama kapatma () işlevini çağırırsa, dosya tanıtıcı, uygulamanın hala sokete / okuma / yazma işlemine devam etmesini sağlar.

Dan alıntılar https://oroboro.com/file-handle-leaks-server/:

Efsane: TCP TIME_WAIT'deki yuvalar dosya tutma düzenlerini tutuyor Rehine

Bir TCP / IP soketini kapattığınızda, işletim sistemi soketi hemen serbest bırakmaz. Karmaşık nedenlerden dolayı, soket yapısı birkaç dakika boyunca dolaşımdan uzak tutulmalıdır, çünkü bir IP paketinin kapatıldıktan sonra bu sokete ulaşması için küçük bir şans vardır. İşletim sistemi soketi tekrar kullanmışsa, o bağlantının yeni kullanıcısı oturumlarını başkalarının kayıp paketlerinden etkileyebilir.

Ancak bu, bir dosya tanıtıcısını açık tutmuyor. Soketin dosya tanımlayıcısını kapattığınızda, dosya tanıtıcısının kendisi kapalıdır. “Çok fazla dosya açık” hatası almazsınız. Çok fazla soketiniz açıksa, sunucunuz yeni bağlantıları kabul etmeyi durdurabilir. Bununla başa çıkmanın yolları vardır (soketlerin yeniden kullanılmasına veya TCP TIME_WAIT değerinin düşürülmesine izin verilir) - ancak dosya tanıtıcı sınırını yükseltmek bunlardan biri değildir.

Efsane: Dosya tanıtıcılarının serbest bırakılması zaman alır

Bu, TCP TIME_WAIT efsanesiyle ilgilidir. Bir dosya tanıtıcısını kapattığınızda, işletim sisteminin tanıtıcıyı serbest bırakması için biraz beklemeniz gerektiğine dair yanlış bir inanış.

Bir dosya tanıtıcısını kapatmak, hangi os yönteminin kaynağı serbest bıraktığını çağırır ve işletim sistemi bu kaynağı derhal ya da daha sonra yuvalarda olduğu gibi bırakacaktır, ancak close () dosya tanıtıcısını hemen dosya tanıtıcı tablosunda serbest bırakır. İşleminiz, dosya tanıtıcısı tablosunun tam denetimindedir ve kendi dosya tanımlayıcı tablosunda bir yuva açmak için herhangi bir şey beklemeniz gerekmez.


4
2018-03-11 17:30





TIME_WAIT bir TCP durumudur ve dosya tanıtıcılarını tüketmeyi tüketmez. Ancak TIME_WAIT içindeki yuvalar dosya tanımlayıcılarını tüketir. Bir soket, unix'te hemen hemen her şey gibi bir dosyadır. Eğer bu Linux ise soketlerin zaman aşım süresini (ne kadar süre bekledikleri) ayarlayabilir, ayrıca soket geri dönüşümünü devreye sokabilirsiniz. /proc/sys/net/ipv4/.

Özellikle ilgi çekici iki öğe muhtemelen:

sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_tw_reuse=1

Her zaman olduğu gibi, eğer yapabilirseniz bunları önceden test edin.


3
2017-09-10 15:32



"TIME_WAIT" bağlantısını tekrar "ESTABLISHED" olarak geri yüklemek mümkün mü? - jyz
AFAIK, soketin bir kapağını () kapatan bağlantı tarafı, diğer tarafın close () / FIN değerini almasını sağlamak için bu soket üzerinde TIME_WAIT konumuna geçer. Eşler FIN'yi görmüyorsa, side (close) araması kapatılmalı (). Yani benim anlayışım, cevabın "mümkün olmamalı, hayır" olması. - James Cape