fbpx
Zaznacz stronę

Iperf3 – testowanie przepustowości łącza

utworzone przez Lut 8, 2019HowTo, 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