У меня есть Linux, который я использую как iperf3
клиент, тестирующий 2 идентично оборудованных серверных бокса Windows 2012 R2 с адаптерами Broadcom BCM5721, 1 Гб (2 порта, но только 1 использовался для теста). Все машины подключены через один коммутатор 1 Гб.
Тестирование UDP, например, на 300 Мбит
iperf3 -uZVc 192.168.30.161 -b300m -t5 --get-server-output -l8192
приводит к потере 14% всех отправленных пакетов (для другого серверного блока с точно таким же оборудованием, но более старыми драйверами сетевого адаптера потеря составляет около 2%), но потеря происходит даже на 50 Мбит, хотя и менее серьезно. Производительность TCP с использованием эквивалентных настроек:
iperf3 -ZVc 192.168.30.161 -t5 --get-server-output -l8192
обеспечивает скорость передачи к северу от 800 Мбит, без каких-либо сообщений о повторных передачах.
Сервер всегда запускается с использованием следующих параметров:
iperf3 -sB192.168.30.161
Кто виноват?
Редактировать:
Теперь попробовал другое направление: Windows -> Linux. Результат: потеря пакетов всегда 0, при этом максимальная пропускная способность составляет около
-l8192
, т.е. фрагментированные IP-пакеты-l1472
, нефрагментированные IP-пакетыЯ предполагаю, что управление потоком ограничивает пропускную способность и предотвращает потерю пакетов. Особенно последний, нефрагментированный показатель далек от пропускной способности TCP (нефрагментированный TCP дает аналогичные показатели для фрагментированного TCP), но это бесконечно огромное улучшение по сравнению с Linux -> Windows с точки зрения потери пакетов.
А как узнать?
Я последовал обычному совету по настройке драйверов на сервере, чтобы максимизировать производительность, и попытался включить / отключить / максимизировать / минимизировать / изменить
Все функции разгрузки включены.
редактировать Еще пробовал включать / отключать
С аналогичными потерями.
Полный вывод выполнения 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:
$ 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
Нет проблем. Это нормальное и ожидаемое поведение.
Причина потери пакетов в том, что UDP не контролирует перегрузку. В tcp, когда срабатывают алгоритмы управления перегрузкой, он сообщает стороне передачи замедлить отправку, чтобы максимизировать пропускную способность и минимизировать потери.
Так что это вполне нормальное поведение для UDP. UDP не гарантирует доставку, если очередь приема перегружена и будут отбрасывать пакеты. Если вам нужна более высокая скорость передачи для UDP, вам необходимо увеличить буфер приема.
Параметр -l или --len iperf должен помочь. И, возможно, настройка целевой полосы пропускания -b на клиенте.
-l, --len n [KM] установить длину буфера чтения / записи равной n (по умолчанию 8 КБ)
8КБ ?? это немного мала, когда нет контроля перегрузки.
например на стороне сервера.
~$ iperf -l 1M -U -s
Это то, что я получаю от Linux до 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
Но для UDP с настройками по умолчанию я получаю только
~$ 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?
После некоторых экспериментов я обнаружил, что мне нужно установить как длину, так и целевую полосу пропускания.
~$ 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.
На стороне сервера:
~$ 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
Чтобы продемонстрировать потерю пакетов с небольшими буферами. Что, честно говоря, не так уж экстремально, как я ожидал. Где можно найти надежный источник iperf3, с которым я могу протестировать 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
На стороне сервера:
~$ 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
Вы также смотрели iperf3 страница на github Прочти меня?
Известные проблемы
Производительность UDP: были замечены некоторые проблемы с iperf3 на испытательном стенде ESnet 100G при высоких скоростях UDP (выше 10 Гбит / с). Симптомом является то, что при любом конкретном запуске iperf3 получатель сообщает о скорости потери около 20%, независимо от параметра -b, используемого на стороне клиента. Эта проблема не является специфической для iperf3 и может быть связана с размещением процесса iperf3 на ЦП и его связью с входящей сетевой картой. В некоторых случаях эта проблема может быть уменьшена соответствующим использованием параметра соответствия ЦП (-A). (Выпуск №55).
Вы используете более медленную сетевую карту, но мне интересно, связано ли это.
Вы полностью упустили самый очевидный виновник - адаптеры, а затем драйверы (вы заявляете, что использование драйверов другой версии дает разные результаты).
Попробуйте отключить все возможности разгрузки.