TCP_NODELAY seçeneğinin sürekli kullanımı
(brooker.co.za)TCP_NODELAY ayarının önemi
- Dağıtık sistemlerde gecikme sorunlarını debug ederken ilk kontrol edilmesi gereken şey, TCP_NODELAY seçeneğinin etkin olup olmadığıdır
- Birçok dağıtık sistem geliştiricisi, bu basit soket seçeneğini etkinleştirerek gecikme sorunlarını hızla çözdüğünü deneyimlemiştir
- Bu, varsayılan davranışın hatalı olabileceğini ya da kavramın tamamının eskimiş olabileceğini düşündürür
Nagle algoritmasının arka planı ve sorunları
- İlk olarak 1984'te John Nagle'ın RFC896'sında önerilen Nagle algoritmasının amacı, TCP header maliyetini daha iyi amorti ederek ağda daha iyi throughput elde etmekti
- Nagle algoritması, daha önce gönderilmiş veriye ait onay yanıtı alınmadıysa yeni TCP segmentlerinin gönderimini bastıracak şekilde çalışır
- Ancak bu, delayed ACK ile etkileşime girerek sorun yaratır
- Nagle algoritması, ACK alınana kadar daha fazla veri gönderimini engeller; delayed ACK ise yanıt hazırlanana kadar ACK'yi geciktirir
- Bu, paketleri doldurmak açısından iyidir ancak gecikmeye duyarlı pipeline uygulamaları için uygun değildir
Modern sistemlerde Nagle algoritmasına duyulan ihtiyaç
- Modern sunucular yüzlerce mikrosaniye içinde çok büyük miktarda iş yapabildiğinden, verinin tek bir RTT kadar bile geciktirilmesinin açık bir faydası olmayabilir
- Çoğu dağıtık veritabanı ve sistem tek baytlık paketler göndermez
- Bunun nedeni, gönderilecek daha fazla veri bulunması ve TLS gibi protokollerin overhead'i ile encoding ve serialization overhead'idir
- Küçük mesajlar göndermemek hâlâ önemlidir, ancak bu artık uygulama katmanında etkili biçimde ele alınmaktadır
TCP_NODELAY kullanımına dair görüş
- Gecikmeye duyarlı dağıtık sistemler kurarken, gönül rahatlığıyla TCP_NODELAY'i etkinleştirebilir (Nagle algoritmasını devre dışı bırakabilirsiniz)
- Modern sistemlerde trafik ve uygulama mix'i ile donanım performansı dikkate alındığında, Nagle algoritmasına ihtiyaç kalmamış olabilir
- Yani TCP_NODELAY varsayılan olmalıdır
- Bu, bazı "her baytı yaz" kodlarını yavaşlatabilir, ancak verimliliğe önem veriyorsanız zaten o uygulamayı düzeltmeniz gerekir
GN⁺ görüşü
-
Nagle algoritması ile delayed ACK arasındaki etkileşim sorunu, protokol tasarımının ne kadar zor olduğunu gösteren iyi bir örnektir. İki makul özelliğin istenmeyen davranış üretmesi durumu, sistem tasarımcılarına tanıdık gelecektir.
-
Uygulama katmanında küçük mesaj gönderimini optimize etmek genel eğilimdir. Verimli encoding ve serialization ile gereksiz overhead'i en aza indirmek önemlidir.
-
Nagle algoritmasının amacı ağ bant genişliğini optimize etmek idiyse, bugün gecikmeyi en aza indirmek daha önemli bir gereksinimdir. Uygulamanın yanıt verebilirliğinin kullanıcı deneyimini doğrudan etkilediği durumlarda gereksiz gecikmeden kaçınılmalıdır.
-
Ancak TCP_NODELAY'i varsayılan yapmak her durumda ideal olmayabilir. Bant genişliğinin kısıtlı olduğu ortamlarda ya da iletim verimliliğinin gecikmeden çok daha önemli olduğu sistemlerde, Nagle algoritmasının seçici biçimde kullanılması gerekebilir.
-
Ağ protokolü tasarımında farklı gereksinimler arasında denge kurmak önemlidir. Genel amaçlı bir protokolün varsayılan davranışını değiştirmek dikkat gerektirir, ancak uygulamanın ihtiyaçlarına uygun seçenekleri seçebilecek esnekliğe sahip olmak da gerekli görünmektedir.
1 yorum
Hacker News yorumu
Özet:
/proc/sys/net/ipv4/tcp_delack_minve/proc/sys/net/ipv4/tcp_ato_minkullanılarak devre dışı bırakılabilir