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.
$ 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í.