Kehilangan paket UDP ekstrim pada 300Mbit (14%), tetapi TCP> 800Mbit tanpa transmisi ulang

11

Saya memiliki kotak linux yang saya gunakan sebagai iperf3klien, menguji 2 kotak server Windows 2012 R2 yang identik dengan Broadcom BCM5721, adaptor 1Gb (2 port, tetapi hanya 1 yang digunakan untuk pengujian). Semua mesin terhubung melalui saklar 1Gb tunggal.

Menguji UDP pada misal 300Mbit

iperf3 -uZVc 192.168.30.161 -b300m -t5 --get-server-output -l8192

mengakibatkan hilangnya 14% dari semua paket yang dikirim (untuk kotak server lain dengan perangkat keras yang sama persis, tetapi driver NIC yang lebih lama, kerugiannya sekitar 2%), tetapi kerugian terjadi bahkan pada 50Mbit, meskipun kurang parah. Kinerja TCP menggunakan pengaturan yang setara:

iperf3 -ZVc 192.168.30.161 -t5 --get-server-output -l8192

menghasilkan kecepatan transmisi di utara 800Mbit, tanpa transmisi ulang yang dilaporkan.

Server selalu dimulai menggunakan opsi berikut:

iperf3 -sB192.168.30.161

Siapa yang harus disalahkan?

  1. Kotak klien linux (perangkat keras? Driver? Pengaturan?)? Sunting: Saya baru saja menjalankan tes dari satu kotak server Windows ke yang lain dan paket UDP yang hilang pada 300Mbit bahkan lebih tinggi, sebesar 22%
  2. Kotak windows server (perangkat keras? Driver? Pengaturan?)?
  3. Sakelar (tunggal) yang menghubungkan semua mesin uji?
  4. Kabel?

Edit:

Sekarang saya mencoba ke arah lain: Windows -> Linux. Hasil: Paket loss selalu 0 , sementara throughput maksimal sekitar

  • 840Mbit untuk -l8192, yaitu paket IP terfragmentasi
  • 250Mbit untuk -l1472, paket IP tidak terfragmentasi

Saya kira throughput kontrol aliran caps, dan mencegah hilangnya paket. Terutama yang terakhir, angka tidak terfragmentasi adalah tempat dekat TCP throughput (TCP tidak terfragmentasi menghasilkan angka yang mirip dengan TCP terfragmentasi), tetapi ini merupakan peningkatan yang jauh lebih besar dari Linux -> Windows dalam hal kehilangan paket.

Dan bagaimana cara mengetahuinya?

Saya memang mengikuti saran yang biasa untuk pengaturan driver di server untuk memaksimalkan kinerja dan mencoba untuk mengaktifkan / menonaktifkan / memaksimalkan / meminimalkan / mengubah

  • Interupsi Moderasi
  • Alur kontrol
  • Terima Buffer
  • RSS
  • Wake-on-LAN

Semua fitur pembongkaran diaktifkan.

Sunting Saya juga mencoba mengaktifkan / menonaktifkan

  • Ethernet @ Wirespeed
  • Berbagai fitur pembongkaran
  • Prioritas & VLAN

Dengan tingkat kerugian yang sama.


Output penuh dari menjalankan UDP:

$ iperf3 -uZVc 192.168.30.161 -b300m -t5 --get-server-output -l8192
iperf 3.0.7
Linux mybox 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt4-3 (2015-02-03) x86_64 GNU/Linux
Time: Wed, 13 May 2015 13:10:39 GMT
Connecting to host 192.168.30.161, port 5201   
      Cookie: mybox.1431522639.098587.3451f174
[  4] local 192.168.30.202 port 50851 connected to 192.168.30.161 port 5201
Starting Test: protocol: UDP, 1 streams, 8192 byte blocks, omitting 0 seconds, 5 second test
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec  33.3 MBytes   279 Mbits/sec  4262
[  4]   1.00-2.00   sec  35.8 MBytes   300 Mbits/sec  4577
[  4]   2.00-3.00   sec  35.8 MBytes   300 Mbits/sec  4578
[  4]   3.00-4.00   sec  35.8 MBytes   300 Mbits/sec  4578
[  4]   4.00-5.00   sec  35.8 MBytes   300 Mbits/sec  4577
- - - - - - - - - - - - - - - - - - - - - - - - -
Test Complete. Summary Results:
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-5.00   sec   176 MBytes   296 Mbits/sec  0.053 ms  3216/22571 (14%)
[  4] Sent 22571 datagrams
CPU Utilization: local/sender 4.7% (0.4%u/4.3%s), remote/receiver 1.7% (0.8%u/0.9%s)

Server output:
-----------------------------------------------------------
Accepted connection from 192.168.30.202, port 44770
[  5] local 192.168.30.161 port 5201 connected to 192.168.30.202 port 50851
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  5]   0.00-1.01   sec  27.2 MBytes   226 Mbits/sec  0.043 ms  781/4261 (18%)
[  5]   1.01-2.01   sec  30.0 MBytes   252 Mbits/sec  0.058 ms  734/4577 (16%)
[  5]   2.01-3.01   sec  29.0 MBytes   243 Mbits/sec  0.045 ms  870/4578 (19%)
[  5]   3.01-4.01   sec  32.1 MBytes   269 Mbits/sec  0.037 ms  469/4579 (10%)
[  5]   4.01-5.01   sec  32.9 MBytes   276 Mbits/sec  0.053 ms  362/4576 (7.9%)

TCP run:

$ iperf3 -ZVc 192.168.30.161 -t5 --get-server-output -l8192
iperf 3.0.7
Linux mybox 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt4-3 (2015-02-03) x86_64 GNU/Linux
Time: Wed, 13 May 2015 13:13:53 GMT
Connecting to host 192.168.30.161, port 5201   
      Cookie: mybox.1431522833.505583.4078fcc1
      TCP MSS: 1448 (default)
[  4] local 192.168.30.202 port 44782 connected to 192.168.30.161 port 5201
Starting Test: protocol: TCP, 1 streams, 8192 byte blocks, omitting 0 seconds, 5 second test
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec   109 MBytes   910 Mbits/sec    0   91.9 KBytes       
[  4]   1.00-2.00   sec  97.3 MBytes   816 Mbits/sec    0   91.9 KBytes       
[  4]   2.00-3.00   sec  97.5 MBytes   818 Mbits/sec    0   91.9 KBytes       
[  4]   3.00-4.00   sec  98.0 MBytes   822 Mbits/sec    0   91.9 KBytes       
[  4]   4.00-5.00   sec  97.6 MBytes   819 Mbits/sec    0   91.9 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
Test Complete. Summary Results:
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-5.00   sec   499 MBytes   837 Mbits/sec    0             sender
[  4]   0.00-5.00   sec   498 MBytes   836 Mbits/sec                  receiver
CPU Utilization: local/sender 3.5% (0.5%u/3.0%s), remote/receiver 4.5% (2.0%u/2.5%s)

Server output:
-----------------------------------------------------------
Accepted connection from 192.168.30.202, port 44781
[  5] local 192.168.30.161 port 5201 connected to 192.168.30.202 port 44782
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec   105 MBytes   878 Mbits/sec                  
[  5]   1.00-2.00   sec  97.5 MBytes   818 Mbits/sec                  
[  5]   2.00-3.00   sec  97.6 MBytes   819 Mbits/sec                  
[  5]   3.00-4.00   sec  97.8 MBytes   820 Mbits/sec                  
[  5]   4.00-5.00   sec  97.7 MBytes   820 Mbits/sec                  
Eugene Beresovsky
sumber

Jawaban:

8

Tidak ada masalah. Ini adalah perilaku normal dan yang diharapkan.

Alasan hilangnya paket adalah karena UDP tidak memiliki kontrol kemacetan. Dalam tcp ketika algoritma kontrol kemacetan masuk, ia akan memberitahu ujung transmisi untuk memperlambat pengiriman untuk memaksimalkan throughput dan meminimalkan kehilangan.

Jadi ini sebenarnya perilaku normal untuk UDP sebenarnya. UDP tidak menjamin pengiriman jika antrian penerimaan kelebihan beban dan akan menjatuhkan paket. Jika Anda ingin tingkat pengiriman yang lebih tinggi untuk UDP, Anda perlu meningkatkan buffer penerimaan Anda.

Opsi -l atau --len iperf harus melakukan trik. Dan mungkin pengaturan bandwidth target -b pada klien.

-l, --len n [KM] mengatur panjang baca / tulis buffer ke n (default 8 KB)

8KB ?? itu sedikit di sisi kecil ketika tidak ada kontrol kemacetan.

misalnya di sisi server.

~$ iperf -l 1M -U -s

Inilah yang saya dapatkan Linux ke Linux

Client connecting to ostore, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.107 port 35399 connected with 192.168.0.10 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.10 GBytes   943 Mbits/sec

Tetapi untuk UDP menggunakan pengaturan default yang saya dapatkan hanya

~$ iperf -u -c ostore 
------------------------------------------------------------
Client connecting to ostore, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.107 port 52898 connected with 192.168.0.10 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.25 MBytes  1.05 Mbits/sec
[  3] Sent 893 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec  1.25 MBytes  1.05 Mbits/sec   0.027 ms    0/  893 (0%)

WT?

Setelah beberapa percobaan saya menemukan saya harus menetapkan panjang, dan target bandwidth.

~$ iperf -u -c ostore -l 8192 -b 1G
------------------------------------------------------------
Client connecting to ostore, UDP port 5001
Sending 8192 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.107 port 60237 connected with 192.168.0.10 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.12 GBytes   958 Mbits/sec
[  3] Sent 146243 datagrams
[  3] WARNING: did not receive ack of last datagram after 10 tries.

Sisi server:

~$ iperf -s -u -l 5M 
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 5242880 byte datagrams
UDP buffer size:  224 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.10 port 5001 connected with 192.168.0.107 port 36448
[ ID] Interval       Transfer     Bandwidth        Jitter   Lost/Total Datagrams
[  3]  0.0-10.1 sec  1008 KBytes   819 Kbits/sec   0.018 ms    0/  126 (0%)
[  4] local 192.168.0.10 port 5001 connected with 192.168.0.107 port 60237
[  4]  0.0-10.0 sec  1.12 GBytes   958 Mbits/sec   0.078 ms    0/146242 (0%)
[  4]  0.0-10.0 sec  1 datagrams received out-of-order

Untuk menunjukkan kehilangan paket dengan buffer kecil. Jujur saja tidak ekstrim seperti yang kuharapkan. Di mana sumber tepercaya untuk iperf3 yang dapat saya uji antara Linux / Windows?

~$ iperf -u -c ostore -l 1K -b 1G
------------------------------------------------------------
Client connecting to ostore, UDP port 5001
Sending 1024 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.107 port 45061 connected with 192.168.0.10 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   674 MBytes   565 Mbits/sec
[  3] Sent 689777 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec   670 MBytes   562 Mbits/sec   0.013 ms 3936/689776 (0.57%)
[  3]  0.0-10.0 sec  1 datagrams received out-of-order

Sisi server:

~$ iperf -s -u -l 1K 
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1024 byte datagrams
UDP buffer size:  224 KByte (default)
------------------------------------------------------------
[  3] local 192.168.0.10 port 5001 connected with 192.168.0.107 port 45061
[ ID] Interval       Transfer     Bandwidth        Jitter   Lost/Total Datagrams
[  3]  0.0-10.0 sec   670 MBytes   562 Mbits/sec   0.013 ms 3936/689776 (0.57%)
[  3]  0.0-10.0 sec  1 datagrams received out-of-order

Apakah Anda juga melihat halaman readme iperf3 github ?

Masalah Dikenal

Kinerja UDP: Beberapa masalah telah diperhatikan dengan iperf3 pada ESnet 100G yang diuji pada tingkat UDP yang tinggi (di atas 10Gbps). Gejalanya adalah bahwa pada setiap menjalankan iperf3 penerima melaporkan tingkat kerugian sekitar 20%, terlepas dari opsi -b yang digunakan pada sisi klien. Masalah ini tampaknya tidak spesifik-iperf3, dan mungkin disebabkan oleh penempatan proses iperf3 pada CPU dan hubungannya dengan NIC inbound. Dalam beberapa kasus masalah ini dapat dikurangi dengan penggunaan opsi afinitas CPU (-A) yang sesuai. (Edisi # 55)

Anda menggunakan NIC lebih lambat tetapi saya ingin tahu apakah ini terkait.

Mat
sumber
Ya dan untuk kehilangan paket, saya akan menunjukkan kepada Anda bagaimana ini bisa terjadi. memperbarui jawaban.
Matt
Terima kasih Matt, baru saja melihat pembaruan Anda. Iperf saya (pada server Windows dan klien Linux) adalah versi 2.0.5. Apa milikmu?
Eugene Beresovsky
Sama. Dan pada kenyataannya ketika saya menetapkan target bandwidth menjadi 1G saya mendapatkan tingkat bandwidth bonkas sebesar 14756449370562973696 Bytes / detik dan output rusak lainnya. Jadi saya pikir itu mungkin rusak. Masih saya pikir masalahnya adalah buffer ... Saya tahu windows melakukan beberapa hal yang tidak biasa dengan TCP dan buffering UDP.
Matt
Aneh. Kemudian hari ini saya mungkin akan mendapatkan akses ke lingkungan produksi 10G yang baik dan akan melepaskan iperf3 pada yang satu itu. Mari kita lihat bagaimana kelanjutannya.
Eugene Beresovsky
1
Saya pikir Anda salah paham apa yang dilakukan -lsaklar. Itu tidak mengatur ukuran buffer; itu menentukan ukuran paket. Ini adalah jumlah data iperf3 yang akan ditulis ke soket dalam sekali jalan, dan membaca dari soket dalam sekali jalan. Anda dapat mengatur ukuran buffer socket menggunakan -w. Jika Anda melihat sumbernya, Anda akan melihat bahwa ia memanggil setsockopt()untuk mengatur ukuran buffer soket ke apa pun yang Anda tentukan setelahnya -w.
András Korn
0

Anda benar-benar ketinggalan pada penyebab paling jelas - adaptor, dan kemudian driver (Anda menyatakan bahwa menggunakan driver versi yang berbeda menghasilkan hasil yang berbeda).

Coba matikan semua kemampuan offload.

Dani_l
sumber
Itu tidak membantu - pertanyaan diperbarui sesuai.
Eugene Beresovsky