Iperf3 – testowanie przepustowości łącza
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.
Chcesz poznać protokół BGP i do wiedzieć się jak z nim pracować?. Dołącz do kurs on-line. (Kliknij tutaj.)
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.
A może chcesz nauczyć się jak automatycznie robić backup i odzyskiwanie konfiguracji?
Kliknij tu.
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
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.