Hlavní navigace

Iperf: měření rychlosti spojení

27. 7. 2012
Doba čtení: 5 minut

Sdílet

Určitě jste si někdy vyzkoušeli nějaký webový tester rychlosti internetového připojení a třeba se divili, proč neukazuje stejnou rychlost, jakou máte ve smlouvě se svým providerem. Dneska se podíváme na to, jak podobné měření realizovat mezi linuxovými stroji a co všechno je možné proti webovým udělátkům provést.

Pokud chcete otestovat parametry svého připojení, nemůže být rychlost tím jediným, na co byste se měli zaměřit. Je jedno, jestli jste správcem sítě nebo si jen hrajete se svým připojením doma, pokud chcete vědět, co od svého přístupu do internetu nebo kamkoli jinam čekat, je nutné použít správné nástroje a proklepnout linku po více stránkách. K tomu v dnešním článku použijeme nástroj iperf.

Hlavní slabinou webových měřídel je hlavně to, že pracují na dost vysoké úrovni a výsledná hodnota může být ovlivněna mnoha faktory počínaje rychlostí Flashe, přes JavaScript až po parametry používaných paketů. V případě, že máte mezi měřeným spojem dva linuxové stroje, není potřeba se spoléhat na nepřesné nástroje a vystačíte si s Linuxem. Navíc takto dokážete zjistit nejen rychlost linky, ale taky jak se chová pod zátěží nebo jak dokáže přenášet data oběma směry, tedy full-duplexně.

Pokud máte připojení přes nějaký drát, není většinou full-duplexního přenosu problém dosáhnout a spojení pojede maximální rychlostí oběma směry najednou. U WiFi spojů je tohle problém, protože oba směry s výjimkami sdílí stejný přenosový kanál, a tak data letí pouze jedním nebo druhým směrem (half-duplexně). Existují technologie, které tuto slabinu potlačují nebo úplně vyruší, ale v takovém případě pak také stoupá cena zařízení a navíc je vyžadována složitější konfigurace. V reálném prostředí na problém half-duplexního přenosu vůbec nemusíte narazit, protože jeho kapacita často převyšuje kapacitu připojení do internetu a do sdíleného média se vejdou oba směry přenosu s rozumnou odezvou.

Po technologických překážkách už pak záleží jen na hardwaru, přes který jste připojeni. Nejslabším místem bývá router, který si uživatelé pořídili sami a těžko jim to dávat za zlé, protože za rozumné peníze se shání dobrý hardware s dobrým softwarem jen velmi špatně. Levné routery možná zvládnou rychlost vašeho připojení, ale mohou mít problémy s jeho náročnějším využitím. Některé síťové protokoly, mezi nimiž je v tomto králem BitTorrent, dokážou vytvořit stovky spojení a vygenerovat stovky až tisíce paketů za sekundu. V takové situaci levnému routeru nestíhá procesor a v lepším případě začne pakety ztrácet, v horším pak dochází k samovolným restartům. Na takové problémy nenarazíte pouhým otestováním rychlosti, ale až praktickým vyzkoušením nebo použitím testovacích nástrojů.

Jak na měření s iperf

Tento článek je zaměřen hlavně na měření rychlosti, ve kterém si ukážeme, jak se používá utilitka iperf. To je program, který může běžet buď v serverovém, nebo klientském režimu. Po navázání spojení začne maximální možnou nebo nastavenou rychlostí posílat data a na konci zobrazí informace o přenosu. Základem ke každému pokusu je spustit server, k čemuž je nejjednodušší možnost použít parametr -s:

# iperf -s 

V takovém případě iperf začne poslouchat na všech dostupných IP adresách, na TCP portu 5001.

root@OpenWrt:~# iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------ 

Iperf bere v serverovém módu několik parametrů, které by vás mohly zajímat.

-u                      UDP mód
-p port                 změna portu
-B rozhraní|adresa      nastavení naslouchání na konkrétní adresu nebo rozhraní
-D                      spustí iperf jako daemona 

Když chceme spustit iperf v klientském režimu, použijeme parametr -c a k němu adresu serveru z předchozího kroku.

$ iperf -c 192.168.1.1
------------------------------------------------------------
Client connecting to 192.168.1.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.1.105 port 50171 connected with 192.168.1.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.1 sec  34.9 MBytes  29.0 Mbits/sec 

Jde o nejjednodušší možnou variantu, a když si prohlédnete manuálovou stránku aplikace, zjistíte, že je možné volání rozšířit o zajímavé volby.

-b cílová rychlost              nastavit maximální rychlost
-d                              obousměrný test
-r                              obousměrný test zvlášť
-t doba testu                   jak dlouho test poběží
-n velikost                     kolik dat se má odeslat
-F soubor                       načíst data pro odeslání ze souboru
-I                              načíst data pro odeslání ze standardního vstupu
-P počet klientů                simulace více klientů
-M velikost                     velikost TCP segmentu 

Pokud vás třeba zajímá, zda dokáže vaše linka přenášet stabilně 20 Mbps jedním směrem po dobu jedné minuty, stačí na jedné straně spustit iperf jako UDP server:

$ iperf -s -u 

A na druhé následujícím způsobem klienta:

$ iperf -c 192.168.1.1 -u -i 2 -b 20M -t 60
------------------------------------------------------------
Client connecting to 192.168.1.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size:  224 KByte (default)
------------------------------------------------------------
[  3] local 192.168.1.105 port 42488 connected with 192.168.1.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 2.0 sec  4.77 MBytes  20.0 Mbits/sec
[  3]  2.0- 4.0 sec  4.77 MBytes  20.0 Mbits/sec
[..]
[  3] 58.0-60.0 sec  4.77 MBytes  20.0 Mbits/sec
[  3]  0.0-60.0 sec   143 MBytes  20.0 Mbits/sec
[  3] Sent 102042 datagrams
[  3] Server Report:
[  3]  0.0-60.0 sec   143 MBytes  20.0 Mbits/sec   0.531 ms    0/102041 (0%)
[  3]  0.0-60.0 sec  1 datagrams received out-of-order 

UDP nemá žádné regulační mechanismy a iperf posílá data nastavenou rychlostí bez ohledu na to, zda dorazí, či ne. V tomto kontextu je pak zajímavější, co vyleze na straně serveru, protože klientská strana nemusí ani vědět, že data dorazila.

[  3] local 192.168.1.1 port 5001 connected with 192.168.1.105 port 42488
[ ID] Interval       Transfer     Bandwidth        Jitter   Lost/Total Datagrams
[  3]  0.0-60.0 sec   143 MBytes  20.0 Mbits/sec   0.531 ms    0/102041 (0%)
[  3]  0.0-60.0 sec  1 datagrams received out-of-order 

Z výstupu poznáme, že vše proběhlo, jak mělo, bylo přijato 143 MB konstantní rychlostí 20 Mbps a rozdíl času cesty paketů kolísal v půl milisekundě. Toto měření proběhlo na lokálním WiFi spoji na vzdálenost pár metrů, ale mnohem zajímavější jsou výsledky z měření cesty dat po internetu. Netuším sice, jak rychlé si platím připojení, ale výsledek stejného testu mezi vzdáleným serverem a mým routerem mi to prozradí více než přesně:

[  3] local 87.236.194.121 port 5001 connected with 88.103.220.182 port 50408
[ ID] Interval       Transfer     Bandwidth       Jitter   Lost/Total Datagrams
[  3]  0.0-60.1 sec    135 MBytes  18.9 Mbits/sec  0.776 ms 5554/102043 (5.4%)
[  3]  0.0-60.1 sec  548 datagrams received out-of-order 

Průměrná rychlost je 18,9 Mbps a pěti procentům ztracených paketů odpovídá rozdíl 1,1 Mbps proti odesílaným 20 Mbps. Půl procenta paketů nedorazilo v pořadí, v jakém byly odeslány, ale rozdíl mezi nejrychlejším a nejpomalejším paketem 0,7 milisekundy není vůbec špatný. Po pár pokusech jsem se bez ztráty jediného paketu dostal na 16 Mbps jedním směrem.

UDP možná ukáže maximální rychlost, ale pokud zrovna nekoukáte na nějaký video stream, bude většina přenosů realizována přes protokol TCP. Ten se dokáže postarat o ztracené pakety i o jejich pořadí, ale tato garance něco stojí. Pro test na TCP stačí server spuštěný s parametrem -s a u klienta vybrat buď testovací čas, nebo celkové množství dat.

CS24_early

$ iperf -c 192.168.1.1 -M 1500 -t 5
[...]
[  3] local 192.168.1.105 port 55214 connected with 192.168.1.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 5.1 sec  19.8 MBytes  32.8 Mbits/sec 

Pokud se vám chce, můžete si ještě pohrát s parametrem -M, který určuje velikost jednotlivých paketů.

Shrnutí

Iperf je utilitka, kterou by měl znát každý správce sítě při testování propustnosti spojů nebo nastavení shaperu. S přidanou hodnotou pak dokáže nahradit různá webová měřidla, kde často není k dispozici měřící metodika. Na druhou stranu není možné od iperf čekat zázraky, skutečný zátěžový test linky a hardwaru na ní položeného udělat neumí.

Byl pro vás článek přínosný?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.