Saturday, 13 December 2008
Juletip 13: fuld fart fremad mod jul
« Juletip 12: Er der nisser på spil eller en puppetmaster? | Main | Juletip 14: webserver test inden julen »Hvis du ligesom min hustru har været til julefrokost igår er dagen måske ikke til ræs med familiebilen, men hvad gør man så?
Jo, man kunne jo sætte sig for at lave lidt hastighedstest af enheder og systemer med benchmarkprogrammer. Nu er benchmark programmer jo meget forskellige, men basalt set bruger vi benchmarkprogrammer til flere ting:
- Checker at udstyret er konfigureret optimalt - check før og efter, så undgår du "jeg synes det kører hurtigere fordi jeg viftede en død gummikylling foran skærmen"
- Tester hvad det maksimale man kan få ud af udstyret - kapacitetsplanlægning, hvornår er det pågældene udstyr for langsomt og man skal vælge en større/kraftigere model
- Tester hvad andre leverer, eksempelvis din internetforbindelse - får du hvad du betaler for
- Stresstest af udstyret - hvis det kan holde til fuld fart i 1 time kan det nok holde til almindeligt brug
- .... og så bruger vi benchmarks til at prale med, min internetforbindelse er større, hurtigerer, bedre end din øv-bøv :-) - min er forøvrigt en fiberforbindelse gennem DONG og Cybercity og det bedste :P
Nå man skal vælge benchmark program er der selvfølgelig mange forskellige til diverse operativsystemer, men idag vil jeg blot præsentere nogle få som jeg med stor glæde har brugt til at teste hastigheden på netværk. NB: de fleste tester båndbredde, men det vil i nogle tilfælde være mindst lige så vigtigt at teste antal pakker pr sekund, pps.
Lad os straks komme igang. De programmer jeg har valgt at tage frem er:
- tcpbench som følger med OpenBSD nu, er altid til stede på OpenBSD
- netstrain som virker på de fleste Unix platforme, ihvertfald dem jeg har prøvet det på
- iperf old-skoool performance testing, har været tilgængelig i evigheder
Derudover kan du teste med diverse speedtest hos internetudbydere:
tcpbench
Er med i OpenBSD - hvilket er det vægtigste argument for at bruge det - hvis man altså bruger OpenBSD. Programmet virker som de fleste af den slags med en server og en client, men bygget ind i samme program. Der skal altså startes en server på en maskine:
hlk@timon:hlk$ tcpbench -s
pid elapsed_ms bytes Mbps
18842 1009 55110880 436.954
18842 1999 53564791 432.847
18842 2999 55012416 440.540
18842 3999 54770600 438.165
18842 4999 54941464 439.532
18842 5999 54812592 438.940
18842 6999 54689512 437.516
18842 closed by remote end
Så lad os straks køre tcpbench client programmet på en anden maskine:
hlk@sylvester:hlk$ tcpbench 10.0.42.42
pid elapsed_ms bytes Mbps
30964 1005 55137319 438.904
30964 1995 53548863 432.718
30964 2995 55019656 440.157
30964 3995 54764808 438.557
30964 4995 54938568 439.509
30964 5996 54816936 438.535
30964 6995 54677928 437.861
^Ctcpbench: Terminated by signal 2
Det er nemt! Bemærk hvordan de har valgt ligesom flere andre at vise resultaterne på både client og server, det letter arbejdet betydeligt.
Resultatet ovenfor er forøvrigt fra Timon som er en Thinkpad X31 OpenBSD/i386 og Sylvester som er en Athlon64 X2 2.2GHz med OpenBSD/amd64 henover en Linksys SRW2008 Gigabit switch og en anden Linksys SRW2016 Gigabit switch - produktionsnetværket hjemme hos mig.
Tcpbench kan også bruges med IPv6, men hmmm det burde jeg måske ikke vise, for performance er lavere?
hlk@sylvester:hlk$ tcpbench 2001:16d8:ffd2:cf0f:20d:60ff:fecb:ac42
pid elapsed_ms bytes Mbps
11721 1003 39079406 311.700
11721 1993 38495336 311.388
11721 2992 39513680 316.426
11721 3993 39297448 314.380
11721 4992 39362680 315.217
Nå dagens plan var at introducere toolet, og systemerne kører et mix af OpenBSD-current så jeg vil ikke tage resultaterne for mere end en demonstration af programmet.
netstrain
Er et superdejligt program til hurtigt at se hastigheden NU - evt. mens man justerer på diverse tunables på routere/firewalls på vejen. Programmet findes ikke som port på OpenBSD, så jeg hentede kildeteksten, udpakkede og skrev make - det tog meget kort tid.
Derefter er det blot at starte netstrain daemonen på en valgfri protokol IPv4/IPv6 og valgfri port:
$ ./netstraind
NetStrain 3.0 (c) 2002 Christoph Pfisterer <cp@chrisp.de>
Usage: netstraind [-46] <port>
$ ./netstraind -4 1234
NetStrain 3.0 (c) 2002 Christoph Pfisterer <cp@chrisp.de>
Listening on 0.0.0.0 port 1234 using IPv4...
One-shot server waiting for connection
Incoming connection from 10.0.42.41 port 34969
Got EOF from socket, shutting down
og samme set fra clienten:
hlk@sylvester:netstrain-3.0$ ./netstrain 10.0.42.42 1234 send
NetStrain 3.0 (c) 2002 Christoph Pfisterer <cp@chrisp.de>
Looking up hostname 10.0.42.42...
Connecting to 10.0.42.42 port 1234 using IPv4...
Connected
sent: 1002M, 53982.7K/s total, 53957.6K/s current
recv'd: 0B, 0B/s total, 0B/s current
^C
Fordelen ved netstrain er at den fortsætter med at måle indtil man stopper den, man kan vælge at sende, modtage eller begge dele samtidig. Det er således nemt at pille ved indstilingerne på systemerne på netværksvejen og se om det ændrer tallene med det samme.
BTW en hurtig omregning mellem Kilobytes pr sekund ~54000K/s til Megabit pr sekund, 54*8=432 viser at det er nogelunde samme hastighed der måles med tcpbench ovenfor og netstrain :-)
iperf
Dette program er nok det bedste hvis man skal forsøge at kommunikere resultaterne til andre - nemt at gentage målingerne. Iperf virker ligeledes på mange platforme. Jeg har iperf som port til OpenBSD og Macport til Mac OS X, og der findes vist en jperf Java version af iperf.
Umiddelbart er iperf ikke så forskellig fra de andre:
hlk@bigfoot:hlk$ iperf
Usage: iperf [-s|-c host] [options]
Try `iperf --help' for more information.
og kører på samme måde - server:
$ iperf
Usage: iperf [-s|-c host] [options]
Try `iperf --help' for more information.
$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[ 4] local 10.0.42.42 port 5001 connected with 10.0.42.41 port 35067
[ 4] 0.0-10.0 sec 576 MBytes 483 Mbits/sec
client:
hlk@sylvester:hlk$ iperf -c 10.0.42.42
------------------------------------------------------------
Client connecting to 10.0.42.42, TCP port 5001
TCP window size: 64.0 KByte (default)
------------------------------------------------------------
[ 3] local 10.0.42.41 port 35067 connected with 10.0.42.42 port 5001
[ 3] 0.0-10.0 sec 576 MBytes 483 Mbits/sec
og dernæst kan man tilpasse testen med diverse options:
hlk@sylvester:hlk$ iperf --help
Usage: iperf [-s|-c host] [options]
iperf [-h|--help] [-v|--version]
Client/Server:
-f, --format [kmKM] format to report: Kbits, Mbits, KBytes, MBytes
-i, --interval # seconds between periodic bandwidth reports
-l, --len #[KM] length of buffer to read or write (default 8 KB)
-m, --print_mss print TCP maximum segment size (MTU - TCP/IP header)
-p, --port # server port to listen on/connect to
-u, --udp use UDP rather than TCP
-w, --window #[KM] TCP window size (socket buffer size)
-B, --bind <host> bind to <host>, an interface or multicast address
-C, --compatibility for use with older versions does not sent extra msgs
-M, --mss # set TCP maximum segment size (MTU - 40 bytes)
-N, --nodelay set TCP no delay, disabling Nagle's Algorithm
-V, --IPv6Version Set the domain to IPv6
Server specific:
-s, --server run in server mode
-U, --single_udp run in single threaded UDP mode
-D, --daemon run the server as a daemon
Client specific:
-b, --bandwidth #[KM] for UDP, bandwidth to send at in bits/sec
(default 1 Mbit/sec, implies -u)
-c, --client <host> run in client mode, connecting to <host>
-d, --dualtest Do a bidirectional test simultaneously
-n, --num #[KM] number of bytes to transmit (instead of -t)
-r, --tradeoff Do a bidirectional test individually
-t, --time # time in seconds to transmit for (default 10 secs)
-F, --fileinput <name> input the data to be transmitted from a file
-I, --stdin input the data to be transmitted from stdin
-L, --listenport # port to recieve bidirectional tests back on
-P, --parallel # number of parallel client threads to run
-T, --ttl # time-to-live, for multicast (default 1)
Miscellaneous:
-h, --help print this message and quit
-v, --version print version information and quit
[KM] Indicates options that support a K or M suffix for kilo- or mega-
The TCP window size option can be set by the environment variable
TCP_WINDOW_SIZE. Most other options can be set by an environment variable
IPERF_<long option name>, such as IPERF_BANDWIDTH.Report bugs to <dast@nlanr.net>
hlk@sylvester:hlk$ iperf -c 10.0.42.42 -f K
------------------------------------------------------------
Client connecting to 10.0.42.42, TCP port 5001
TCP window size: 64.0 KByte (default)
------------------------------------------------------------
[ 3] local 10.0.42.41 port 41821 connected with 10.0.42.42 port 5001
[ 3] 0.0-10.0 sec 594656 KBytes 59465 KBytes/sec
Målinger
Husk når du skal til at lave målinger:
- En måling er ikke nok, jeg prøver typisk med tre eller flere til jeg får stabile resultater
- Prøv at eliminere fejlkilder, jeg prøver typisk i labsetups først med kabel direkte mellem maskinerne, før jeg indsætter switch
Så er det måske tid til at opremse lidt målinger.
Mellem to maskiner på samme SRW2016 switch, Athlon64 OpenBSD/i386 <-> Athlon64 OpenBSD/amd64 med iperf:
bla
hlk@fluffy:hlk$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 64.0 KByte (default)
------------------------------------------------------------
[ 4] local 10.0.42.23 port 5001 connected with 10.0.42.41 port 6446
[ 4] 0.0-10.0 sec 526 MBytes 441 Mbits/sec
[ 4] local 10.0.42.23 port 5001 connected with 10.0.42.41 port 34889
[ 4] 0.0-10.0 sec 525 MBytes 441 Mbits/sec
[ 4] local 10.0.42.23 port 5001 connected with 10.0.42.41 port 9749
[ 4] 0.0- 1.4 sec 74.4 MBytes 438 Mbits/sec
[ 4] local 10.0.42.23 port 5001 connected with 10.0.42.41 port 4485
[ 4] 0.0-10.0 sec 526 MBytes 441 Mbits/sec
[ 4] local 10.0.42.23 port 5001 connected with 10.0.42.41 port 19815
[ 4] 0.0-10.0 sec 526 MBytes 441 Mbits/sec
[ 4] local 10.0.42.23 port 5001 connected with 10.0.42.41 port 23919
[ 4] 0.0-10.0 sec 526 MBytes 441 Mbits/sec
Den ene bruger syskonnect sk-driveren, den anden nvidia nfe-driver - tilsammen giver det altså ~440Mbits/sec. Hvad så med tilsvarende maskiner på hver sin side af en Soekris 5501:
$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 64.0 KByte (default)
------------------------------------------------------------
[ 4] local 10.0.0.200 port 5001 connected with 10.0.42.41 port 10889
[ 4] 0.0-10.0 sec 89.9 MBytes 75.4 Mbits/sec
[ 4] local 10.0.0.200 port 5001 connected with 10.0.42.41 port 15876
[ 4] 0.0-10.0 sec 89.9 MBytes 75.4 Mbits/sec
[ 4] local 10.0.0.200 port 5001 connected with 10.0.42.41 port 10300
[ 4] 0.0-10.0 sec 89.8 MBytes 75.2 Mbits/sec
Øv, det giver kun ~75Mbits/sec - faktisk lidt mindre end jeg tidligere har målt Soekris 5501 til tror jeg. Men stadig er min Soekris med 100Mbit interfaces fin nok til min internet forbindelse som er 25/25Mbit :-) For sjov skyld kunne jeg så prøve med min lille legemaskine en Juniper SSG5 firewall også med 100Mbit interfaces
hlk@sylvester:hlk$ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 64.0 KByte (default)
------------------------------------------------------------
[ 4] local 10.0.42.41 port 5001 connected with 10.0.42.17 port 2463
[ 4] 0.0-10.0 sec 109 MBytes 91.1 Mbits/sec
[ 4] local 10.0.42.41 port 5001 connected with 10.0.42.17 port 2851
[ 4] 0.0-10.0 sec 108 MBytes 91.0 Mbits/sec
[ 4] local 10.0.42.41 port 5001 connected with 10.0.42.17 port 1037
[ 4] 0.0-10.0 sec 109 MBytes 91.1 Mbits/sec
Lækkert! En soekrislignende maskine med superoptimeret software og hardware giver altså over 90Mbit stabilt - nok hvad man kunne forvente for en box der koster mere end tre gange så meget som en Soekris. (Samtidig er min soekris også webserver, puppetmaster, MRTG+rrdtool analyseplatform osv.)
Hmm, hvad med forbindelsen fra mit netværk herhjemme, Sylvester til min Pumba i servercamp i Ballerup, via DONG fiber, Cybercity, Netgroup, Armada Hosting til min box:
hlk@sylvester:hlk$ tcpbench -p 80 91.102.91.18
pid elapsed_ms bytes Mbps
11979 1007 3068687 24.379
11979 1997 2978536 24.093
11979 2997 3032112 24.257
11979 3997 3023424 24.187
11979 4997 3001704 24.038
Det er da OK - netop en af grundene til at jeg ønskede min gamle ADSL 6144/768 udskiftet!
Nå, det er vist nok for idag, håber I har fået lyst til at bruge testprogrammerne :-)
Update: IPv6 hastighedstest repeat. Det var underligt som IPv6 testen ovenfor var dårligere end IPv4 testen, så jeg prøvede lige lidt mere:
$ ping sunny
PING sunny.kramse.org (10.0.0.200): 56 data bytes
64 bytes from 10.0.0.200: icmp_seq=0 ttl=254 time=0.499 ms
64 bytes from 10.0.0.200: icmp_seq=1 ttl=254 time=0.463 ms
--- sunny.kramse.org ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 0.463/0.481/0.499/0.018 ms
$ ping6 sunny
PING6(56=40+8+8 bytes) 2001:16d8:ffd2:cf0f:20d:60ff:fecb:ac42 --> 2001:16d8:ffd2::200
16 bytes from 2001:16d8:ffd2::200, icmp_seq=0 hlim=63 time=1.467 ms
16 bytes from 2001:16d8:ffd2::200, icmp_seq=1 hlim=63 time=0.32 ms
16 bytes from 2001:16d8:ffd2::200, icmp_seq=2 hlim=63 time=0.437 ms
^C
--- sunny.kramse.org ping6 statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 0.320/0.741/1.467/0.515 ms
$ time scp -4 -P45461 testfil sunny:
testfil 100% 10MB 10.0MB/s 00:01
0m2.00s real 0m0.25s user 0m0.15s system
$ time scp -4 -P45461 testfil sunny:
testfil 100% 10MB 5.0MB/s 00:02
0m2.00s real 0m0.21s user 0m0.17s system
$ time scp -4 -P45461 testfil sunny:
testfil 100% 10MB 10.0MB/s 00:01
0m1.99s real 0m0.32s user 0m0.10s system
$ time scp -6 -P45461 testfil sunny:
Warning: Permanently added the RSA host key for IP address '[2001:16d8:ffd2::200]:45461' to the list of known hosts.
testfil 100% 10MB 10.0MB/s 00:01
0m2.10s real 0m0.27s user 0m0.11s system
$ time scp -6 -P45461 testfil sunny:
testfil 100% 10MB 10.0MB/s 00:01
0m2.12s real 0m0.21s user 0m0.17s system
$ time scp -6 -P45461 testfil sunny:
testfil 100% 10MB 10.0MB/s 00:01
0m2.00s real 0m0.28s user 0m0.10s system
$ time scp -6 -P45461 testfil sunny:
testfil 100% 10MB 5.0MB/s 00:02
0m2.02s real 0m0.26s user 0m0.11s system
$ time scp -4 -P45461 testfil sunny:
testfil 100% 10MB 10.0MB/s 00:01
0m1.96s real 0m0.30s user 0m0.13s system
Hmm, det ser meget ens ud med SCP af en fil på 10MB - jeg tør ikke lige sige hvorfor ovenstående test gav et andet resultat.
Posted by at CET 11:12 13/12/2008 in Toolbox entries
[Trackback URL for this entry]


Når du nu nævner udbydernes egne hastigheds test, så vil jeg lige gøre opmærksom på at it-borger.dk også har et testprogram liggende(desværre kun til windows..så jeg har ikke så meget at bruge det til)
http://bredbaandsmaaleren.it-borger.dk/?show=download
Før har it og telestyresen brugt det program man bruger mange steder der hedder tptest som kan hentes her:
http://tptest.sourceforge.net/ og der er så tptest.dk man kan teste op imod
Jeg ved ihvertfald at it og telestyrelsen havde et par maskiner stående ude på DIX'en man kunne teste mod dengang de brugte tptest. Jeg formoder de gør noget lignende med den nye test, så man altså får en udbyder uafhæbgig test