TCP_DEFER_ACCEPT Gerçek Dünya Kullanımı?


15

Çevrimiçi Apache httpd el kitabını inceliyordum ve bunu etkinleştirmek için bir direktifle karşılaştım. Man sayfasında şunun için bir açıklama bulundu tcp:

   TCP_DEFER_ACCEPT (since Linux 2.4)
          Allow a listener to be awakened only when data arrives on the
          socket.  Takes an integer value (seconds), this can bound the
          maximum number of attempts TCP will make to complete the
          connection.  This option should not be used in code intended
          to be portable.

Sonra bu makaleyi buldum, ancak bunun ne tür iş yükleri için yararlı olacağından hala emin değilim. httpdÖzellikle bunun için bir seçenek varsa , web sunucuları ile ilgili olması gerektiğini varsayıyorum . Ayrıca httpd, ağ bağlantılarının nasıl yapıldığını değil, istediğiniz yerde ve istemediğiniz yerlerde kullanım durumlarının olduğunu da bir seçenek olarak kabul ediyorum.

Makaleyi okuduktan sonra bile, üç yollu el sıkışmasının tamamlanmasını beklemenin avantajının ne olacağından emin değilim. httpdBir bağlantı kurulduktan sonra potansiyel olarak bu gecikmeye neden olmak yerine el sıkışma devam ederken, ilgili örneği değiştirmeye gerek kalmamasını sağlamak avantajlı görünecektir .

Makale için, TCP_DEFER_ACCEPTbir soketin durumu ne olursa olsun, hala dört pakete ihtiyacınız olacak gibi görünüyor (el sıkışma sonra her durumda veri). Sayıyı nasıl üçe düşürdüğünü veya bunun nasıl anlamlı bir artış sağladığını bilmiyorum.

Yani sorum şu: Bu sadece eski bir seçenek mi yoksa bu seçenek için gerçek bir kullanım durumu var mı?


Ne demek istediğini açıklığa kavuşturmuyorum "üçe kadar sayımı al", bu da beni üç yönlü anlaşmayı yanlış anladığından şüpheleniyor. Bu bir TCP "açık bağlantı" işlemidir ve aktarılan toplam 3 paketten oluşur. Bu 3 işlem tamamlanana kadar, veri yoktur ve geçerli bir bağlantı yoktur. Bu tür veriler asla el sıkışma yükünü etkilemez. TCP_DEFER_ACCEPT soket seçeneği elde olacaktır verim artışı 'kabul' TCP 3 elsikisma tamamlanması arasındaki boşluk ve birinci veri paketi (I 3 vs 4 elsikisma üzerinde yoruma burada daha ziyade, varsayalım) olacaktır
iain

Ayrıca, 'takastan' kaçınmak değil, kaynakları israf etmemekle ilgilidir. Eğer takas bir HTTP çalışanını aktive etmede bir faktör olacaksa, çalışanınızı veri hazır olmadan önce kabul noktasında erken takas yapmaya zorlarsınız ... ve takas oluyorsa, bu başka bir şeyi zorlamak anlamına gelir. ram ... belki bir şey yapan ve kabul / veri bölümünüz arasında geri takas edilen bir şey ... hangi kaynak olursa olsun - CPU, diskIO, ram sayfaları, veri yoksa, o zaman işe neden olmanın bir anlamı yoktur.
Iain

Çalışan işlem zaten bellekte ise, muhtemelen diske gidecek olana kıyasla oldukça düşük bir gecikme değil mi? "Üçe kadar", bir şekilde bunun istemciden gelen ilk veri paketinin üçüncü paket üzerinde olmasını sağlayacak şekilde makaleye yapılan bir göndermedir.
Bratchley

Ayrıca, teorik takas yine de gerçekleşecek, bu TCP seçeneğiyle bu değişmeyecek. TCP bağlantısını oluşturma ve veri aktarımına koyma boşluğunun ne kadar yararlı olduğunu görmüyorum. En azından TCP bağlantısı oluşturma sırasında bunu yaparken, ikisinin paralel olarak olma olasılığı vardır (zaman miktarını azaltır).
Bratchley

Bir cevap yazmış olmalıydı ... Bir seçenek olması açısından, "normal" unix standartlarının nasıl çalıştığı değil ... Özellikle HTTP ile ilgili temel nokta, istemcinin (web tarayıcısı) GET line ... Yani sunucu gerçek bağlantıyı umursamıyor, sadece ilk veriyi. SMTP'nin aksine, istemcinin sunucu "220 karşılama başlığı" mesajını yayınlamasını beklemesini gerektirir. Yani sunucunun veriyi değil bağlantıyı bilmesi gerekir.
Iain

Yanıtlar:


14

(OP hakkındaki yorumlarımı özetlemek için)

Bahsedildikleri üç yönlü el sıkışma TCP bağlantı kuruluşunun bir parçasıdır, söz konusu seçenek özellikle bununla ilgili değildir. Ayrıca veri alışverişinin üç yollu el sıkışmasının bir parçası olmadığını unutmayın, bu sadece TCP bağlantısını açık / yerleşik durumda oluşturur.

Bu seçeneğin varlığı ile ilgili olarak, bu bir soketin geleneksel davranışı değildir, normalde bağlantı kabul edildiğinde (yine de üç yönlü el sıkışmasının tamamlanmasından sonradır) soket işleyicisinin ipliği uyanır ve bazı protokoller için aktivite burada başlar ( örneğin bir SMTP sunucusu 220 karşılama satırı gönderir), ancak HTTP için konuşmadaki ilk mesaj GET / POST / etc satırını gönderen web tarayıcısıdır ve bu gerçekleşene kadar HTTP sunucusunun bağlantıya ilgisi yoktur (zamanlama dışında) bu nedenle, soket kabulü tamamlandığında HTTP sürecini uyandırmak, işlemin gerekli verileri bekledikten hemen sonra tekrar uykuya dalacağı için savurgan bir etkinliktir.

Boşta kalma işlemlerini uyandırmanın onları daha fazla işlem için hazır hale getirebileceğine dair bir argüman olsa da (özellikle çok eski makinelerde giriş terminallerini uyandırmayı ve takastan çekilmelerini hatırlıyorum), ancak aynı zamanda söz konusu sürecin kaynakları üzerinde zaten talepte bulunduğunu ve daha fazla gereksiz talepte bulunmanın genel olarak sistem performansını düşürebileceğini belirtti - bireysel iş parçanızın görünür performansı iyileşse bile (ki bu çok da yoğun olmayan bir makinenin disk IO'sunda darboğazlar olurdu) takas ederseniz diğer şeyleri yavaşlatır ve eğer o meşgulse, hemen uyku hemen geri takas edebilir). Bir kumar gibi görünüyor ve nihayetinde 'açgözlü' kumar, yoğun bir makinede mutlaka ödemez,

Bu performans ayarlama düzeyi ile ilgili genel tavsiyem, neyin en iyi olduğuna dair programlı kararlar vermek değil, sistem yöneticisi ve işletim sisteminin kaynak yönetimi sorunları ile başa çıkmak için birlikte çalışmasına izin vermek - bu onların işi ve çok tüm sistemin ve ötesindeki iş yüklerini anlamak için daha uygundur. Seçenekler ve yapılandırma seçenekleri verin.

Soruyu özel olarak cevaplamak için, seçenek, HTTP trafiğinin aşırı yükü dışında fark edeceğiniz seviyeye değil, tüm yapılandırmalarda yararlıdır, ancak teorik olarak bunu yapmanın "doğru" yoludur. Bu bir seçenektir, çünkü tüm Unix (hatta tüm Linux değil) lezzetleri bu özelliğe sahip değildir ve bu nedenle taşınabilirlik için dahil edilmeyecek şekilde yapılandırılabilir.


Harika özet için teşekkürler. Sunucu yükü ve boşta kalma / uyanma işlemi potansiyel bir avantaj olsa da (bahsettiğiniz gibi incelikli), yüksek ve düşük gecikmeli istemcilere hizmet veren bir HTTP sunucusuna bakarsanız elde edilecek net faydalar vardır. Örneğin, Apache web sunucusunu çalıştırırken, belirli bir anda sabit sayıda istemciye hizmet verilebileceği anlamına gelen sabit sayıda sunucu işlemi / iş parçacığı mevcuttur. Bu nedenle, bir istemciden gelen "veri" paketi gelmediği sırada bir sunucu işlemini "kullanmamak" sunucu işleminin bu süre içinde başka bir istemciye hizmet edebileceği anlamına gelebilir.
Ram

-1

Üç yollu el sıkışmasının tamamlanmasının avantajının ne olacağından emin değilim.

Üç yönlü el sıkışmalar sesli telefon konuşmalarında yaygın olarak kullanılan bir protokoldür:

  1. Sunucu : "İyi günler, Epiphyte Corp."
  2. Arayan : "Merhaba, bu Randy."
  3. Sunucu : "Evet, size nasıl yardımcı olabilirim?"
  4. Arayan : çağrı gövdesi bir şaka talep etmeye başlar

TCP'de kanalın kurulmasını sağlamak için önemlidirler. Müşteri , işitmeden önce çağrı gövdesi göndermeye başladıysa (3), Sunucunun dinlememesi veya hazır olmaması ihtimali vardır. İşitme (3), Sunucunun iletimden hemen sonra kendiliğinden yanmadığını garanti etmez, ancak Sunucunun almaya hazır olduğu güvenini artırır.

El Sıkışma hakkındaki Wikipedia'da belirtildiği gibi :

  1. Alice [Sunucu], Bob [İstemci] tarafından alınan ve yanıtlaması gerekmeyen onay numarası y + 1 olan bir onay mesajıyla yanıt verir .

Bu nedenle, sunucunun hazır olduğuna dair biraz ek kesinlikten vazgeçmek istiyorsanız, Sunucu (3) adımını atlayabilir ve istemci sunucunun hazır olduğunu varsayar. Bu, yukarıdaki protokol değişimini şuna dönüştürür:

  1. Sunucu : "İyi günler, Epiphyte Corp."
  2. Arayan : "Merhaba, bu Randy."
  3. Arayan : "Imelda Marcos hakkında şakalar biliyor musun?"

Bu sadece güven değil, 3 yol tamamlanmadan ve verileriniz dolanmadan önce gönderin. TCP bağlantılarının modern işletim sistemi yığınlarında nasıl kurulacağı aslında bağlantının 3. bölümüne kadar tablolarda kayıtlı bağlantı verisi yoktur, herhangi bir kaynak tüketilmeden önce 3. iletinin gerekliliği "Syn Cookies" kullanılarak yapılır ve "Syn-Attacks" (sahte-kaynak-ip el sıkışma paketi 1. olan bu sahte kaynak ip zayıflatan paket 3) engeller. Bu nedenle, bu noktadan önce herhangi bir bağlantı veya giriş yoktur.
Iain

İşitme (3), Sunucunun iletimden hemen sonra kendiliğinden yanmadığını garanti etmez, ancak Sunucunun almaya hazır olduğu güvenini artırır.
msw

Artırmak? Sıfırdan mı? Evet, sanırım tam anlamıyla bu doğru, ama çoğu insan 3 paketinden önce / bir / şans artacağını ima eder. Ve yok. Bu sadece sevmediğim "güveni artır" ifadesi ve% 0,001 'gerçek dünyadaki önemli konular' da çarpanlara ayırmanın sorunu açık tutmaya yardımcı olduğunu düşünmüyorum. Tabii, sunucu paketi almadan önce nükleer savaş olabilir, birçok şey olabilir.
Iain

Ayrıca son paragrafta aldım, burada 3. adımın isteğe bağlı olduğunu ima edersiniz. Değil, kesinlikle değil. Paragrafı yeniden okuyun, 3. adım "alice bir onayla yanıtlar" dır. bu isteğe bağlı değildir. Bob buna (teorik 4. adım) cevap veriyor.
Iain
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.