VDS (Sanal Özel Sunucu) üzerinde yüksek trafikli web uygulamaları çalıştırırken, belirli saatlarda "Connection refused" hatası alıyor, yeni kullanıcılar siteye bağlanamıyor, ancak sunucu kaynakları (RAM, CPU) normal seviyelerde ise, sorun büyük ihtimalle TCP bağlantı sayısı sınırında veya TIME_WAIT durumunda kalmış bağlantılardan kaynaklanıyordur. Bu sorun özellikle e-ticaret siteleri, API sunucuları ve yüksek I/O işlemleri yapan uygulamalarda sıkça görülür.
TIME_WAIT Durumu Nedir ve Neden Sorun Yaratır?
TCP protokolü, bağlantı kapatılırken güvenli bir sonlandırma işlemi gerçekleştirir. Bağlantı kapandıktan sonra, ağ trafiğinde geç kalan paketlerin yanlış yeni bağlantıya gitmemesi için, işletim sistemi bağlantıyı belirli bir süre (varsayılan 60 saniye) TIME_WAIT durumunda tutar. Bu bağlantılar bellekte yer kaplar ve sistem kaynağı tüketir.
Yüksek trafikli sunucularda, binlerce TIME_WAIT bağlantısı aynı anda bulunabilir. Her bağlantı bellek kullansa da, asıl sorun eşzamanlı açık bağlantı sayısının işletim sistemi limiti aşmasıdır. Linux'ta bu limit net.ipv4.ip_local_port_range ile tanımlanan port aralığına bağlıdır; varsayılan olarak 15.000-30.000 port arası kullanılabilir. TIME_WAIT bağlantıları bu portları "işgal" ettiğinden, yeni bağlantılar kurulamaz.
TIME_WAIT Bağlantılarını İzleme ve Tanılama
Sorunun boyutunu anlamak için şu komutları çalıştırın:
ss -tan | grep TIME_WAIT | wc -l
Bu komut, TIME_WAIT durumundaki TCP bağlantı sayısını gösterir. 10.000'in üzerindeyse, ciddi bir sorununuz var demektir.
cat /proc/sys/net/ipv4/ip_local_port_range
Port aralığını kontrol edin. Eğer TIME_WAIT bağlantıları, mevcut port havuzunun çoğunu işgal ediyorsa, yeni portlar bulunamaz.
netstat -tan | head -20
Açık bağlantıları ve durumlarını gerçek zamanlı izlemek için kullanın.
VDS'de tcp_tw_reuse ile TIME_WAIT Bağlantılarını Yeniden Kullanma
Hızlı çözüm, TIME_WAIT bağlantılarını yeniden kullanmaktır. Root erişimi ile /etc/sysctl.conf dosyasını açın:
nano /etc/sysctl.conf
Şu satırları ekleyin veya var olanları değiştirin:
net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_fin_timeout = 30
tcp_tw_reuse = 1, TIME_WAIT durumundaki socketleri yeni bağlantılar için güvenli bir şekilde yeniden kullanır. tcp_fin_timeout, TIME_WAIT süresini 60 saniyeden 30 saniyeye düşürür. Değişiklikleri uygulamak için:
sysctl -p
Bu değişiklik hemen etki eder ve ek sunucu yeniden başlatması gerekmez.
tcp_tw_recycle: Riski ve Güncel Durumu
Eski kaynaklar sık sık net.ipv4.tcp_tw_recycle = 1 önerirler, ancak bu yöntem modern ağlarda (NAT, proxy arkasında sunucular) sorunlar yaratır. Linux Kernel 4.12+ sürümlerinde bu parametre yok sayılıp kaldırılmıştır. Bundan kaçının; yerine tcp_tw_reuse kullanın.
Uygulama Seviyesinde Bağlantı Yönetimi
Sistem ayarlarının yanı sıra, uygulamada da iyileştirmeler yapabilirsiniz:
- HTTP Keep-Alive Etkinleştirin: Web sunucunuzda (Nginx, Apache) Keep-Alive açık olduğundan emin olun. Bu, tek TCP bağlantısı üzerinde birden fazla HTTP isteğinin gönderilmesini sağlar, bağlantı sayısını önemli ölçüde azaltır.
- Veritabanı Bağlantı Pooling: Node.js, Python, PHP gibi uygulamalarda connection pooling kullanın. Her istek için yeni veritabanı bağlantısı açmak yerine, pool'dan bir bağlantı reutilize edin.
- Bağlantı Timeout'ları Ayarlayın: Gereksiz açık kalan bağlantıları hızla kapatacak timeout değerleri belirleyin. Örneğin, Nginx'te
keepalive_timeout 30s;
Port Aralığını Genişletmek ve Sonlandırma Süresi
Eğer TIME_WAIT bağlantı yoğunluğu çok yüksekse, kullanılabilir port havuzunu genişletin:
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
Bu, port aralığını standart 15.000'den ~64.000'e çıkarır. Kalıcı hale getirmek için /etc/sysctl.conf'a ekleyin.
İlave olarak, TIME_WAIT süresini daha da kısaltabilirsiniz (riskli olabilir):
net.ipv4.tcp_fin_timeout = 15
Ancak çok kısa değerler (10 saniyenin altı) ağ gecikmesi olan bölgelerde paket kaybına neden olabilir.
Gerçek Dünya Örneği: API Gateway Sunucusu
Bir API gateway sunucusu, ön uç uygulamalarından gelen istekleri arka uç servislerine yönlendirir. Dakikada 100.000 istek işliyorsa ve her istek yeni bir TCP bağlantısı açıp kapatıyorsa, TIME_WAIT havuzu dakikalar içinde dolabilir. tcp_tw_reuse = 1 ile bu bağlantılar yeniden kullanılır ve sorun çözülür. Ayrıca HTTP/2 veya gRPC gibi çok yollu protokoller kullanarak, bağlantı sayısını köklü şekilde azaltabilirsiniz.
VDS üzerindeki sunucularınızda bu tür ağ sorunlarıyla karşılaşıyorsanız, Bogahost'un yönetilen VDS hizmetleri, sistem optimizasyonu ve 24/7 teknik destek sunarak bu tür sorunları proaktif olarak yönetmenize yardımcı olabilir.
Yorumlar (0)
Henüz yorum yapılmamış. İlk yorumu siz yapın!
Yorum Yap