Mengapa throughput TCP saya jauh lebih besar dari throughput UDP?

15

Saya belum melakukan sesuatu yang tidak biasa pada konfigurasi perangkat keras atau kernel saya (semua pengaturan default, instalasi OS baru, kernel Linux 3,11 TCP / IP stack) dan saya rata-rata sekitar 3,83 juta pesan per detik melalui TCP sementara saya hanya rata-rata 0,75 juta pesan per detik melalui UDP. Ini tampaknya benar-benar menentang apa yang saya harapkan dari kedua protokol.

Apa penyebab yang paling mungkin untuk perbedaan drastis dan bagaimana saya bisa mendiagnosisnya di Ubuntu 13.10?

#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

Untuk pengujian ini saya memiliki dua server pengujian yang identik dan terhubung langsung melalui kabel crossover 10G. NIC yang digunakan dalam kasus ini adalah Intel X520's dengan konfigurasi out-of-box dan terhubung ke slot PCIe 3.0 x8 pada motherboard, yang berkomunikasi dengan CPU melalui pengontrol NUMA.

elleciel
sumber
Bagaimana Anda mengukurnya? Terhadap apa yang Anda kirim paket-paket itu?
Braiam
Saya menggunakan netperftes benchmark, UDP_STREAM dan TCP_STREAM, diperbaiki untuk CPU yang sama, dan ukuran pesan 64 byte.
elleciel
1
Itu tidak menjawab pertanyaan @ Braiam. Topologi jaringan dan metode pengujian rinci penting, di sini.
Pavel Šimerda
1
@ PavelŠimerda Maaf, saya pikir dia hanya meminta metodologi pengujian saja. Mengenai topologi jaringan, kedua server uji identik dan terhubung langsung melalui kabel crossover 10G. NIC yang digunakan dalam kasus ini adalah Intel X520's dengan konfigurasi out-of-box dan terhubung ke slot PCIe 3.0 x8 pada motherboard, yang berkomunikasi dengan CPU melalui pengontrol NUMA. Apakah ini menjawab pertanyaan Anda?
elleciel
1
Ya, @elleciel, itu pasti menjawab pertanyaan saya. Meskipun dalam hal ini saya tidak memiliki keahlian untuk memberi Anda jawaban untuk mesin yang terhubung langsung. Saya melihat Anda mengubah pertanyaan itu sendiri, yang bagus. Akan muncul pertanyaan seperti sekarang saya juga tertarik.
Pavel Šimerda

Jawaban:

29

Selain tidak mendapatkan informasi terperinci tentang pengaturan pengujian Anda, tampaknya masalah utamanya adalah bahwa Anda menggunakan ukuran pesan 64 byte. Ini jauh dari MTU biasa yang terdiri dari 1500 byte dan membuat UDP sangat tidak efisien: sementara TCP menggabungkan banyak pengiriman ke dalam satu paket pada kabel (kecuali jika TCP_NODELAY diatur) untuk membuat penggunaan tautan yang efisien, setiap pesan UDP akan menghasilkan paket terpisah. Dalam angka: sekitar 23 pesan ukuran 64 byte akan digabungkan menjadi satu paket TCP ukuran MTU, sementara itu akan membutuhkan 23 paket tunggal untuk UDP untuk jumlah data yang sama. Masing-masing paket ini berarti overhead dengan mengirimkan dari host, mentransmisikan pada kabel dan menerima oleh rekan. Dan seperti yang terlihat dalam kasus Anda, sekitar 80% dari paket UDP hilang karena perangkat keras Anda tidak cukup cepat untuk mengirim dan menerima semua paket ini.

Jadi yang dapat Anda pelajari dari tolok ukur ini adalah:

  • UDP tidak bisa diandalkan (kehilangan paket 80%)
  • UDP tidak efisien jika digunakan dengan ukuran paket jauh di bawah MTU
  • TCP sangat dioptimalkan untuk memanfaatkan tautan dengan sebaik-baiknya

Adapun harapan Anda, bahwa UDP harus lebih baik: apakah Anda pernah bertanya-tanya mengapa semua transfer file utama (ftp, http, ...) dilakukan dengan protokol berbasis TCP? Tolok ukur menunjukkan alasannya kepada Anda.

Jadi mengapa orang menggunakan UDP?

  • Dengan data real-time (mis. Voice over IP) Anda tidak peduli dengan pesan lama, jadi Anda tidak ingin pengirim menggabungkan pesan ke dalam paket yang lebih besar untuk memanfaatkan tautan secara efektif. Dan Anda lebih suka menerima bahwa suatu paket hilang daripada sampai terlambat.
  • Dengan tautan latensi tinggi (seperti dengan satelit), perilaku default TCP tidak optimal untuk memanfaatkan tautan secara efektif. Jadi, beberapa orang beralih ke UDP dalam kasus ini dan mengimplementasikan kembali lapisan keandalan TCP dan mengoptimalkannya untuk tautan latensi tinggi, sementara yang lain menyetel tumpukan TCP yang ada untuk memanfaatkan tautan dengan lebih baik.
  • "membuang" data: kadang-kadang lebih penting untuk mengirim data dan tidak peduli tentang kehilangan paket, seperti dengan pesan log (syslog)
  • Interaksi singkat: dengan TCP Anda harus membuat koneksi dan mempertahankan status, yang menghabiskan waktu dan sumber daya di klien dan server. Untuk interaksi singkat (seperti permintaan pendek dan balasan) ini mungkin terlalu banyak biaya tambahan. Karena DNS ini biasanya dilakukan dengan UDP tetapi telah dibangun ulang di atas UDP.
Steffen Ullrich
sumber
2
Anda juga harus melihat kehilangan paket 80% Anda dengan UDP. Sepertinya perangkat keras Anda tidak cukup cepat untuk memproses paket dengan kecepatan yang sama dengan yang mereka kirim. Sementara TCP beradaptasi dengan paket jenis ini dengan melambat, UDP hanya akan mengirim dengan kecepatan yang sama dan terus melonggarkan paket. Tetapi pada akhirnya tidak relevan seberapa cepat Anda dapat mengirim, tetapi apa yang Anda terima.
Steffen Ullrich
1
Hal lain yang mungkin menjadi faktornya adalah akselerasi / pembongkaran TCP ke kartu jaringan (jika mendukungnya).
cpugeniusmv
1
Pengiriman paket mungkin lebih efisien daripada menerima, terutama jika yang terakhir didorong oleh interupsi.
Steffen Ullrich
1
orang juga menggunakan UDP untuk perangkat tertanam untuk menyiarkan data yang dikumpulkannya melalui kabel dan tidak repot dengan pengaturan koneksi
ratchet freak
3
Anda kemungkinan besar terikat oleh bus ekspres PCI. Kartu jaringan akan mengaktifkan offloading segmen TCP, kemungkinan besar. Ini berarti bahwa transfer TCP akan dikirim ke kartu sebagai satu blok besar, kemudian kartu mengiris dan memotongnya menjadi paket dan menempatkannya di kabel. Tidak ada padanan untuk UDP, jadi hasilnya adalah satu transaksi PCIe (dan semua overhead terkait) untuk setiap paket.
alex.forencich