fbpx
Zaznacz stronę

Iperf3 – testowanie przepustowości łącza

utworzone przez | Lut 8, 2019 | HowTo, teoria

Jako administrator lub architekt sieci często dostajesz zgłoszenia lub sam zgłaszasz, że łącze nie ma przewidywanej umową przepustowości.

Co wtedy robisz?

Przeprowadzasz testy.

Ok, ale czym? Speedtest? Pobieranie i wysyłanie pliku? Monitorowanie wykresów?

Dzisiejszy wpis będzie o narzędziu Iperf. Ale na początek powiedzmy o pozostałych narzędziach.

Speedtest.

Test przeprowadzany za pomocą aplikacji lub serwisów speedtest jest przeprowadzany pomiędzy twoim hostem a serwerem www, na którym działa aplikacja speedtest. To wprowadzam nam pewne ograniczenia.

Nie możemy testować dedykowanych połączeń punkt – punkt i punkt – wielo-punkt.

Nie mamy wpływu na obciążenie łącza do serwera speedtest jak i na sam serwer. W takiej sytuacji wyniki mogą być zafałszowane.

Pobieranie i wysyłanie pliku

Występuje tu ograniczenie w postaci jednej sesji pomiędzy hostem a serwerem. Może być problem aby wysycić łącze jedną sesją np.: wget. Dochodzi też ograniczenie w postaci łącza do serwera i obciążenie samego serwera (w przypadku publicznie dostępnych usług).

Monitorowanie wykresów

Sprawdzając wykresy, możemy zobaczyć czy wysycenie łącza wystąpiło w przeszłości i ile razy miało miejsce.

Iperf

Jest to jedno z podstawowych narzędzi każdego inżyniera sieciowego. Pozwala na wykonanie testów połączenia IP z założonymi parametrami.

Są dostępne dwie wersje iperf: Iperf2 i Iperf3. Występują pomiędzy nimi pewne różnice związane z wielowątkowością i możliwościami wyświetlania wyników. W dalszej części wpisu będę używał iperf3. Musisz pamiętać, że pomiędzy wersjami nie ma kompatybilności wstecznej, tzn. Iperf3 nie połączy się z serwerem iperf2.

Dość teorii, przejdźmy do działanie.

Instalacja Iperf3

Instalacja Iperf3 jest prosta.  W Ubuntu możemy zainstalować za pomocą apt-get lub skompilować źródła. Ja wybrałem apt-get.

sudo apt-get install iperf3

Narzędzie nie wymaga wstępnej konfiguracji, od razu po instalacji jest gotowe do użycia.

Iperf działa w architekturze klient-serwer. Ma to swoje duże plusy. Aby wykonać test musimy mieć dwa systemy, nad którymi mamy pełną kontrolę. Musimy zainstalować iperf3 na obu hostach.

Iperf3 – podstawy

Aby uruchomić serwer Iperf musimy wydać polecenie:

iperf3 -s

Po stronie klienta wydajemy polecenie:

iperf3 -c <adres_serwera>

Wyniki dla iperf i iperf3

iperf3 -s

———————————————————–

Server listening on 5201

———————————————————–

Accepted connection from 10.10.50.3, port 37724

[  5] local 10.10.50.4 port 5201 connected to 10.10.50.3 port 37726

[ ID] Interval           Transfer Bandwidth

[  5]  0.00-1.00   sec 2.16 GBytes  18.6 Gbits/sec

[  5]  1.00-2.00   sec 2.01 GBytes  17.3 Gbits/sec

[  5]  2.00-3.00   sec 1.81 GBytes  15.6 Gbits/sec

[  5]  3.00-4.00   sec 1.83 GBytes  15.7 Gbits/sec

[  5]  4.00-5.00   sec 1.83 GBytes  15.8 Gbits/sec

[  5]  5.00-6.00   sec 1.84 GBytes  15.8 Gbits/sec

[  5]  6.00-7.00   sec 1.80 GBytes  15.5 Gbits/sec

[  5]  7.00-8.00   sec 1.81 GBytes  15.5 Gbits/sec

[  5]  8.00-9.00   sec 1.84 GBytes  15.8 Gbits/sec

[  5]  9.00-10.00  sec 1.64 GBytes  14.1 Gbits/sec

[  5] 10.00-10.04  sec 64.4 MBytes 14.6 Gbits/sec

– – – – – – – – – – – – – – – – – – – – – – – – –

[ ID] Interval           Transfer Bandwidth    Retr

[  5]  0.00-10.04  sec 18.6 GBytes  16.0 Gbits/sec 737             sender

[  5]  0.00-10.04  sec 18.6 GBytes  16.0 Gbits/sec              receiver

Iperf3 klient:

iperf3 -c 10.10.50.4

Connecting to host 10.10.50.4, port 5201

[  4] local 10.10.50.3 port 37726 connected to 10.10.50.4 port 5201

[ ID] Interval           Transfer Bandwidth    Retr Cwnd

[  4]  0.00-1.00   sec 2.26 GBytes  19.4 Gbits/sec 0   1.54 MBytes

[  4]  1.00-2.00   sec 1.99 GBytes  17.1 Gbits/sec 0   1.62 MBytes

[  4]  2.00-3.00   sec 1.82 GBytes  15.6 Gbits/sec 0   1.62 MBytes

[  4]  3.00-4.00   sec 1.83 GBytes  15.7 Gbits/sec 0   1.62 MBytes

[  4]  4.00-5.00   sec 1.83 GBytes  15.7 Gbits/sec 0   1.62 MBytes

[  4]  5.00-6.00   sec 1.84 GBytes  15.8 Gbits/sec 0   1.62 MBytes

[  4]  6.00-7.00   sec 1.80 GBytes  15.5 Gbits/sec 0   1.62 MBytes

[  4]  7.00-8.00   sec 1.81 GBytes  15.5 Gbits/sec 0   1.62 MBytes

[  4]  8.00-9.00   sec 1.84 GBytes  15.8 Gbits/sec 0   1.62 MBytes

[  4]  9.00-10.00  sec 1.64 GBytes  14.1 Gbits/sec 737   1.16 MBytes

– – – – – – – – – – – – – – – – – – – – – – – – –

[ ID] Interval           Transfer Bandwidth    Retr

[  4]  0.00-10.00  sec 18.6 GBytes  16.0 Gbits/sec 737             sender

[  4]  0.00-10.00  sec 18.6 GBytes  16.0 Gbits/sec              receiver

 

iperf Done.

A co gdy nas nie satysfakcjonują domyślne ustawienia? Możemy zmieniać je za pomocą przełączników.

Zmiana formatowania wyników  

Aby zmienić format wyświetlanych wyników należy użyć przełącznika -f

iperf3 -c <adres_serwera> -f <format>

Format:
G – GB/s
g – Gb/s
M – MB/s
m – Mb/s
K – KB/s
k – Kb/s
B – B/s
b – b/s

Takie same formaty są wykorzystywane w innych poleceniach, np. w następnym.

Test to ustalonej przepustowości

iperf3 -c <adres_serwera> -b<przepustowość>

Łącze będzie testowane do 100 Megabitów:

iperf3 -c 10.10.50.4 -b 100m

Connecting to host 10.10.50.4, port 5201

[  4] local 10.10.50.3 port 37846 connected to 10.10.50.4 port 5201

[ ID] Interval           Transfer Bandwidth    Retr Cwnd

[  4]  0.00-1.00   sec 10.8 MBytes  90.2 Mbits/sec 0    882 KBytes

[  4]  1.00-2.00   sec 12.0 MBytes   101 Mbits/sec 0  1.11 MBytes

[  4]  2.00-3.00   sec 11.9 MBytes  99.6 Mbits/sec 0   1.18 MBytes

[  4]  3.00-4.00   sec 11.9 MBytes  99.6 Mbits/sec 0   1.24 MBytes

[  4]  4.00-5.00   sec 12.0 MBytes   101 Mbits/sec 313   624 KBytes

[  4]  5.00-6.00   sec 11.9 MBytes  99.6 Mbits/sec 0    628 KBytes

[  4]  6.00-7.00   sec 12.0 MBytes   101 Mbits/sec 0   635 KBytes

[  4]  7.00-8.00   sec 11.9 MBytes  99.6 Mbits/sec 0    641 KBytes

[  4]  8.00-9.00   sec 11.9 MBytes  99.6 Mbits/sec 0    648 KBytes

[  4]  9.00-10.00  sec 12.0 MBytes   101 Mbits/sec 0   656 KBytes

– – – – – – – – – – – – – – – – – – – – – – – – –

[ ID] Interval           Transfer Bandwidth    Retr

[  4]  0.00-10.00  sec 118 MBytes  99.1 Mbits/sec 313             sender

[  4]  0.00-10.00  sec 118 MBytes  99.1 Mbits/sec              receiver

Zmiana czasu trwania testu

Aby zmienić czas musisz użyć przełącznika -t

iperf -c <adres_serwera> -t <czas_w_sekundach>

Testy będą wykonywane przez 5 sekund:

iperf3 -c 10.10.50.4 -t 5

Connecting to host 10.10.50.4, port 5201

[  4] local 10.10.50.3 port 37854 connected to 10.10.50.4 port 5201

[ ID] Interval           Transfer Bandwidth    Retr Cwnd

[  4]  0.00-1.00   sec 2.51 GBytes  21.6 Gbits/sec 0   1.13 MBytes

[  4]  1.00-2.00   sec 1.87 GBytes  16.0 Gbits/sec 0   1.13 MBytes

[  4]  2.00-3.00   sec 1.81 GBytes  15.6 Gbits/sec 0   1.13 MBytes

[  4]  3.00-4.00   sec 1.85 GBytes  15.9 Gbits/sec 0   1.13 MBytes

[  4]  4.00-5.00   sec 1.83 GBytes  15.7 Gbits/sec 0   1.13 MBytes

– – – – – – – – – – – – – – – – – – – – – – – – –

[ ID] Interval           Transfer Bandwidth    Retr

[  4]  0.00-5.00   sec 9.87 GBytes  17.0 Gbits/sec 0             sender

[  4]  0.00-5.00   sec 9.87 GBytes  17.0 Gbits/sec              receiver

Zmiana interwału pomiędzy kolejnymi testami

Domyślny interwał między testami wynosi 1 sekundę. Do zmiany interwału służy przełącznik -i

Iperf3 -c <adres_serwera> -i <interwał_w_sekundach>

Test będzie realizowany z 3 sekundowym interwałem:

iperf3 -c 10.10.50.4 -i 3

Connecting to host 10.10.50.4, port 5201

[  4] local 10.10.50.3 port 37866 connected to 10.10.50.4 port 5201

[ ID] Interval             Transfer         Bandwidth           Retr Cwnd

[  4]  0.00-3.00   sec 5.28 GBytes  15.1 Gbits/sec 0    956 KBytes

[  4]  3.00-6.00   sec 5.45 GBytes  15.6 Gbits/sec 0    956 KBytes

[  4]  6.00-9.00   sec 5.44 GBytes  15.6 Gbits/sec 0   1.01 MBytes

[  4]  9.00-10.00  sec 1.74 GBytes  15.0 Gbits/sec 0   1.22 MBytes

– – – – – – – – – – – – – – – – – – – – – – – – –

[ ID] Interval               Transfer       Bandwidth                       Retr

[  4]  0.00-10.00  sec 17.9 GBytes  15.4 Gbits/sec 0             sender

[  4]  0.00-10.00  sec 17.9 GBytes  15.4 Gbits/sec              receiver

Zmiana MSS

MSS to Maximum Segment Size. Jest to największa ilość danych, w bajtach, jaką system może wysłać w jednym nie sfragmentowanym segmencie TCP.

MSS = MTU – TCP i nagłówki IP

Do zmiany MSS służy przełącznik -M

Iperf3 -c <adres_serwera> -M <wartość_MSS>

Ustalamy rozmiar MSS na 1000

iperf3 -c 10.10.50.4 -M 1000

Connecting to host 10.10.50.4, port 5201

[  4] local 10.10.50.3 port 37882 connected to 10.10.50.4 port 5201

[ ID] Interval             Transfer        Bandwidth               Retr             Cwnd

[  4]  0.00-1.00   sec 2.24 GBytes  19.3 Gbits/sec 18    583 KBytes

[  4]  1.00-2.00   sec 2.00 GBytes  17.2 Gbits/sec 0    770 KBytes

[  4]  2.00-3.00   sec 1.88 GBytes  16.2 Gbits/sec 0    771 KBytes

[  4]  3.00-4.00   sec 1.96 GBytes  16.9 Gbits/sec 0    800 KBytes

[  4]  4.00-5.00   sec 1.97 GBytes  16.9 Gbits/sec 0    809 KBytes

[  4]  5.00-6.00   sec 1.69 GBytes  14.5 Gbits/sec 66    730 KBytes

[  4]  6.00-7.00   sec 1.87 GBytes  16.0 Gbits/sec 0    786 KBytes

[  4]  7.00-8.00   sec 1.89 GBytes  16.2 Gbits/sec 0    837 KBytes

[  4]  8.00-9.00   sec 1.83 GBytes  15.7 Gbits/sec 0    844 KBytes

[  4]  9.00-10.00  sec 1.92 GBytes  16.5 Gbits/sec 0    854 KBytes

– – – – – – – – – – – – – – – – – – – – – – – – –

[ ID] Interval               Transfer        Bandwidth                     Retr

[  4]  0.00-10.00  sec 19.3 GBytes  16.5 Gbits/sec 84             sender

[  4]  0.00-10.00  sec 19.2 GBytes  16.5 Gbits/sec              receive

Równoległe testy

Iperf pozwala na wykonanie kilku testów jednocześnie

iperf -c <adres_serwera> -P <ilość_testów>

Przeprowadźmy 4 testy z 2 sekundowym interwałem

iperf3 -c 10.10.50.4 -P 4 -i 2

Connecting to host 10.10.50.4, port 5201

[  4] local 10.10.50.3 port 37886 connected to 10.10.50.4 port 5201

[  6] local 10.10.50.3 port 37888 connected to 10.10.50.4 port 5201

[  8] local 10.10.50.3 port 37890 connected to 10.10.50.4 port 5201

[ 10] local 10.10.50.3 port 37892 connected to 10.10.50.4 port 5201

[ ID] Interval              Transfer        Bandwidth                 Retr Cwnd

[  4]  0.00-2.00   sec 1.30 GBytes  5.57 Gbits/sec 134    648 KBytes

[  6]  0.00-2.00   sec 1.28 GBytes  5.49 Gbits/sec 106    624 KBytes

[  8]  0.00-2.00   sec 1.27 GBytes  5.46 Gbits/sec 49    655 KBytes

[ 10]   0.00-2.00   sec 1.29 GBytes  5.53 Gbits/sec 94    666 KBytes

[SUM]   0.00-2.00   sec 5.13 GBytes  22.0 Gbits/sec 383

– – – – – – – – – – – – – – – – – – – – – – – – –

[  4]  2.00-4.00   sec 1.81 GBytes  7.77 Gbits/sec 0    704 KBytes

[  6]  2.00-4.00   sec 1.79 GBytes  7.68 Gbits/sec 22    584 KBytes

[  8]  2.00-4.00   sec 1.77 GBytes  7.62 Gbits/sec 218    492 KBytes

[ 10]   2.00-4.00   sec 1.77 GBytes  7.61 Gbits/sec 68    427 KBytes

[SUM]   2.00-4.00   sec 7.14 GBytes  30.7 Gbits/sec 308

– – – – – – – – – – – – – – – – – – – – – – – – –

[  4]  4.00-6.00   sec 1.74 GBytes  7.48 Gbits/sec 1107    701 KBytes

[  6]  4.00-6.00   sec 1.71 GBytes  7.32 Gbits/sec 719    622 KBytes

[  8]  4.00-6.00   sec 1.70 GBytes  7.30 Gbits/sec 841    868 KBytes

[ 10]   4.00-6.00   sec 1.70 GBytes  7.28 Gbits/sec 962    659 KBytes

[SUM]   4.00-6.00   sec 6.84 GBytes  29.4 Gbits/sec 3629

– – – – – – – – – – – – – – – – – – – – – – – – –

[  4]  6.00-8.00   sec 1.65 GBytes  7.09 Gbits/sec 263    601 KBytes

[  6]  6.00-8.00   sec 1.65 GBytes  7.07 Gbits/sec 364    400 KBytes

[  8]  6.00-8.00   sec 1.60 GBytes  6.88 Gbits/sec 324    518 KBytes

[ 10]   6.00-8.00   sec 1.62 GBytes  6.95 Gbits/sec 325    588 KBytes

[SUM]   6.00-8.00   sec 6.52 GBytes  28.0 Gbits/sec 1276

– – – – – – – – – – – – – – – – – – – – – – – – –

[  4]  8.00-10.00  sec 1.71 GBytes  7.36 Gbits/sec 533    639 KBytes

[  6]  8.00-10.00  sec 1.71 GBytes  7.33 Gbits/sec 588    601 KBytes

[  8]  8.00-10.00  sec 1.67 GBytes  7.15 Gbits/sec 499    584 KBytes

[ 10]   8.00-10.00  sec 1.70 GBytes  7.30 Gbits/sec 90    615 KBytes

[SUM]   8.00-10.00  sec 6.78 GBytes  29.1 Gbits/sec 1710

– – – – – – – – – – – – – – – – – – – – – – – – –

[ ID] Interval              Transfer        Bandwidth                            Retr

[  4]  0.00-10.00  sec 8.21 GBytes  7.05 Gbits/sec 2037             sender

[  4]  0.00-10.00  sec 8.21 GBytes  7.05 Gbits/sec              receiver

[  6]  0.00-10.00  sec 8.13 GBytes  6.98 Gbits/sec 1799             sender

[  6]  0.00-10.00  sec 8.12 GBytes  6.98 Gbits/sec              receiver

[  8]  0.00-10.00  sec 8.01 GBytes  6.88 Gbits/sec 1931             sender

[  8]  0.00-10.00  sec 8.01 GBytes  6.88 Gbits/sec              receiver

[ 10]   0.00-10.00  sec 8.07 GBytes  6.93 Gbits/sec 1539             sender

[ 10]   0.00-10.00  sec 8.07 GBytes  6.93 Gbits/sec              receiver

[SUM]   0.00-10.00  sec 32.4 GBytes  27.8 Gbits/sec 7306             sender

[SUM]   0.00-10.00  sec 32.4 GBytes  27.8 Gbits/sec              receiver

 

Jak pewnie zauważyłeś iperf pozwala na łączenie przełączników.

Debug iperf3

Iperf3 nie wyświetla ustawień gdy zaczyna testować połączenie. Aby zobaczyć ustawienia testu musimy użyć przełącznika -d. W przykładzie zmienimy MSS na 1000.

iperf3 -c 10.10.50.4 -M 1000 -d

send_parameters:

{

“tcp”: true,

“omit”: 0,

“time”: 10,

“MSS”: 1000,

“parallel”: 1,

“len”: 131072

}

Connecting to host 10.10.50.4, port 5201

[  4] local 10.10.50.3 port 37896 connected to 10.10.50.4 port 5201

tcpi_snd_cwnd 1138 tcpi_snd_mss 988

[ ID] Interval           Transfer Bandwidth    Retr Cwnd

Wynik debug jest zwracany w formacie json. Jeśli chcemy dostać wyniki w json musimy wykorzystać przełącznik -J

iperf3 -c 10.10.50.4 -M 1000 -J

{

     “start”: {

   “connected”: [{

     “socket”: 4,

     “local_host”: “10.10.50.3”,

     “local_port”: 37900,

     “remote_host”: “10.10.50.4”,

    “remote_port”: 5201

}],

                         “version”: “iperf 3.0.11”,

                         “system_info”: “Linux test 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux\n”,

                         “timestamp”: {

                                      “time”: “Fri, 08 Feb 2019 09:20:33 GMT”,

                                     “timesecs”: 1549617633

                          },

                         “connecting_to”: {

                                      “host”: “10.10.50.4”,

                                      “port”: 5201

                       },

                       “cookie”: “test.1549617633.963573.2bcd91a530748”,

                       “tcp_mss”: 1000,

                       “test_start”: {

                                      “protocol”: “TCP”,

                                      “num_streams”: 1,

                                      “blksize”: 131072,

                                      “omit”: 0,

                                      “duration”: 10,

                                      “bytes”: 0,

                                      “blocks”: 0,

                                      “reverse”: 0

UDP zamiast TCP – Iperf3 to potrafi

Iperf może testować połączenie z wykorzystaniem UDP.

Domyślnie klient Iperf3 używa przepustowości 1Mb/s. W tym teście zmienimy na 1000m.

iperf3 -c 10.10.50.4 -u -b 1000m

Connecting to host 10.10.50.4, port 5201

[  4] local 10.10.50.3 port 50937 connected to 10.10.50.4 port 5201

[ ID] Interval             Transfer        Bandwidth        Total Datagrams

[  4]  0.00-1.00   sec 110 MBytes   920 Mbits/sec 14040

[  4]  1.00-2.00   sec 119 MBytes   997 Mbits/sec 15214

[  4]  2.00-3.00   sec 120 MBytes  1.01 Gbits/sec 15394

[  4]  3.00-4.00   sec 119 MBytes   995 Mbits/sec 15188

[  4]  4.00-5.00   sec 119 MBytes   997 Mbits/sec 15219

[  4]  5.00-6.00   sec 119 MBytes  1.00 Gbits/sec 15294

[  4]  6.00-7.00   sec 119 MBytes   996 Mbits/sec 15201

[  4]  7.00-8.00   sec 119 MBytes  1.00 Gbits/sec 15263

[  4]  8.00-9.00   sec 119 MBytes  1.00 Gbits/sec 15262

[  4]  9.00-10.00  sec 118 MBytes   994 Mbits/sec 15167

– – – – – – – – – – – – – – – – – – – – – – – – –

[ ID] Interval           Transfer Bandwidth    Jitter Lost/Total Datagrams

[  4]  0.00-10.00  sec 1.15 GBytes   991 Mbits/sec 0.028 ms  51492/151242 (34%)

[  4] Sent 151242 datagrams

Iperf3 – bonus

Iperf3 w ostatniej wersji pozwala na znalezienie wąskich gardeł pomiędzy siecią na infrastrukturą serwerową. Aby przeprowadzić test musisz:

Uruchomić serwer iperf3:

iperf3 -s

Uruchomić test “memory to memory”. Jest to podstawowy test, taki jak na początku wpisu.

iperf3 -c <adres_serwera>

Następnie musisz przeprowadzić test odczytu:

Uruchamiasz klienta iperf3 z parametrem -F

iperf3 -c <adres_serwera> -F <ścieżka_do_pliku_który_ma_zostać_odczytany>

Ostatnim testem jest test zapisu:

Serwer iperf3:

iperf3 -s -F <ścieżka_do_pliku_który_ma_zostać_odczytany>

Klient iperf3:

Iperf3 -c <adres_serwera> -i 1 -t 30

Test zapisu powinien być wydłużony, aby wykazać możliwe problemy z buforowanie.

“Najwolniejszy” wynik testu wskazuje wąskie gardło, w którym może być problem z przepustowością.

Podsumowanie

Iperf jest narzędziem, które musi znać każdy inżynier i administrator sieci. Powyższy tekst nie wyczerpuje w całości tematu. Jakie są twoje “ulubione” polecenia iperf, które stosujesz w swojej pracy? Podziel się nimi w komentarzu.

Tomasz Mikołajek

Tomasz Mikołajek

Założyciel Showroute.pl

Inżynier sieciowy lubiący dzielić się wiedzą i pomagać innym zrozumieć zawiłości działania sieci i Internetu.

Share This