TCP işlem hacmim neden UDP işlem hacminden çok daha yüksek?


15

Donanım veya çekirdek yapılandırmalarım için alışılmadık bir şey yapmadım (tüm varsayılan ayarlar, yeni işletim sistemi yüklemesi, Linux çekirdeği 3.11 TCP / IP yığını) ve TCP üzerinden saniyede yaklaşık 3.83 milyon ileti ortalaması alıyorum. UDP ile saniyede milyon mesaj. Bu, iki protokolden beklediğim şeylere tamamen meydan okuyor gibi görünüyor.

Büyük farkın en olası nedeni nedir ve Ubuntu 13.10'da nasıl teşhis koyabilirim?

#TCP RESULTS
Recv   Send    Send                          Utilization       Service Demand
Socket Socket  Message  Elapsed              Send     Recv     Send    Recv
Size   Size    Size     Time     Throughput  local    remote   local   remote
bytes  bytes   bytes    secs.    10^6bits/s  % S      % S      us/KB   us/KB

87380  65536     64    10.00      1963.43   32.96    17.09    5.500   2.852

#UDP RESULTS
Socket  Message  Elapsed      Messages                   CPU      Service
Size    Size     Time         Okay Errors   Throughput   Util     Demand
bytes   bytes    secs            #      #   10^6bits/sec % SS     us/KB

4194304      64   10.00     7491010      0      383.5     28.97    24.751
212992            10.00     1404941              71.9     25.03    21.381

Bu test için 10G çapraz kablo ile aynı ve doğrudan bağlı iki test sunucum var. Bu durumda kullanılan NIC'ler, kutudan çıktığı gibi yapılandırılmış ve anakarttaki CPU ile bir NUMA denetleyicisi aracılığıyla iletişim kuran PCIe 3.0 x8 yuvasına bağlı Intel X520'lerdir.


Testleri nasıl yaptınız? Bu paketleri ne gönderdiğine karşı?
Braiam

Ben netperfkıyaslamalar, UDP_STREAM ve TCP_STREAM testleri, aynı CPU sabit ve 64 bayt ileti boyutları için kullandım.
elleciel

1
Bu @ Braiam'ın sorusuna cevap vermiyor. Ağ topolojisi ve burada ayrıntılı test yöntemi önemlidir.
Pavel Šimerda

1
@ PavelŠimerda Üzgünüm, sadece test metodolojisini istediğini sanıyordum. Ağ topolojisi ile ilgili olarak, iki test sunucusu aynıdır ve doğrudan 10G çapraz kablo ile bağlanır. Bu durumda kullanılan NIC'ler, kutudan çıktığı gibi yapılandırılmış ve anakarttaki CPU ile bir NUMA denetleyicisi aracılığıyla iletişim kuran PCIe 3.0 x8 yuvasına bağlı Intel X520'lerdir. Bu sorunuza cevap veriyor mu?
elleciel

1
Evet, @elleciel, kesinlikle soruma cevap veriyor. Bu durumda, doğrudan bağlı makineler için size cevap verecek uzmanlığa sahip değilim. Sorunun kendisini değiştirdiğini görüyorum, bu harika. Soruyu şimdi çıkartacağım, ben de ilgileniyorum.
Pavel Šimerda

Yanıtlar:


29

Test kurulumunuz hakkında ayrıntılı bilgi almanın yanı sıra, asıl sorun 64 baytlık bir mesaj boyutu kullanmanız gibi görünüyor. Bu, 1500 baytlık olağan MTU'dan çok uzaktır ve UDP'yi oldukça verimsiz hale getirir: TCP, bağlantıyı verimli kullanmak için birden çok gönderimi tel üzerinde tek bir pakette birleştirir (TCP_NODELAY ayarlanmışsa hariç), her UDP iletisi ayrı bir paket. Sayılarla: 64 bayt boyutundaki yaklaşık 23 mesaj MTU boyutundaki tek bir TCP paketinde birleştirilirken, aynı miktarda veri için UDP için 23 tek pakete ihtiyaç duyacaktır. Bu paketlerin her biri, ana bilgisayardan gönderme, tel üzerinden iletim ve eş tarafından alma ile ek yük anlamına gelir. Ve davanızda görüldüğü gibi UDP paketlerinin yaklaşık% 80'i kayboluyor çünkü donanımınız tüm bu paketleri iletmek ve almak için yeterince hızlı değil.

Bu kriterden öğrenebileceğiniz şey:

  • UDP güvenilir değil (% 80 paket kaybı)
  • MTU'nun altında paket boyutları ile kullanılırsa UDP verimsizdir
  • TCP, bağlantıdan en iyi şekilde yararlanmak için son derece optimize edilmiştir

Beklentinize gelince, bu UDP daha iyi olmalı: Tüm büyük dosya aktarımlarının (ftp, http, ...) TCP tabanlı protokollerle neden yapıldığını hiç merak ettiniz mi? Kıyaslama size bunun nedenini gösterir.

Peki neden insanlar UDP kullanıyor?

  • Gerçek zamanlı verilerle (örn. IP üzerinden ses) eski mesajları önemsemezsiniz, bu nedenle bağlantının etkili bir şekilde kullanılması için gönderenin mesajları daha büyük paketler halinde birleştirmesini istemezsiniz. Ve bir paketin çok geç gelmesinden çok kaybolduğunu kabul edersiniz.
  • Yüksek gecikmeli bağlantılarda (uydularda olduğu gibi) TCP'nin varsayılan davranışı, bağlantının etkili bir şekilde kullanılması için uygun değildir. Bu yüzden bazı insanlar bu durumda UDP'ye geçer ve TCP'nin güvenilirlik katmanını yeniden uygular ve yüksek gecikmeli bağlantılar için optimize eder, diğerleri ise bağlantıyı daha iyi kullanmak için mevcut TCP yığınını ayarlar.
  • verileri "atmak": bazen verileri göndermek ve günlük mesajlarında olduğu gibi paket kaybını önemsememek daha önemlidir (syslog)
  • Kısa etkileşimler: TCP ile, bir bağlantı kurmanız gerekir; bu, istemci ve sunucuda zaman ve kaynaklara mal olan bir durum sağlar. Kısa etkileşimler için (kısa istek ve cevap gibi) bu çok fazla yük olabilir. Bu nedenle DNS genellikle UDP ile yapılır, ancak UDP'nin üzerinde yeniden deneme oluşturmuştur.

2
Ayrıca UDP ile% 80 paket kaybınıza da göz atmalısınız. Donanımınız paketleri gönderdikleri hızda işlemek için yeterince hızlı değil gibi görünüyor. TCP yavaşlama ile bu tür bir paket kaybına uyum sağlarken, UDP sadece aynı hızda gönderecek ve paketleri kaybetmeye devam edecektir. Ama sonunda ne kadar hızlı gönderebileceğiniz değil, ne alacağınız önemli.
Steffen Ullrich

1
Faktör olabilecek başka bir şey, TCP hızlandırma / ağ kartına boşaltmadır (destekliyorsa).
cpugeniusmv

1
Paket gönderme, özellikle sonuncusu kesmeye bağlıysa, almaktan daha etkili olabilir.
Steffen Ullrich

1
insanlar ayrıca bir tel üzerinden topladığı verileri yayınlamak ve bağlantı kurulumu ile uğraşmamak için gömülü bir cihaz için UDP kullanır
cırcır ucube

3
Büyük olasılıkla PCI express veriyoluna bağlı IO'sunuz. Ağ kartlarında büyük olasılıkla TCP segmenti boşaltma etkin olacaktır. Bu, TCP aktarımlarının karta büyük blok olarak gönderileceği anlamına gelir, daha sonra kart dilimleri paketler ve dilimler ve kabloya koyar. UDP için eşdeğer yoktur, bu nedenle sonuç her paket için bir PCIe işlemi (ve ilişkili tüm ek yükler) olur.
alex.forencich
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.