[ LUGOS ] test mrezne povezave

Bostjan Vlaovic bostjan.vlaovic na uni-mb.si
Sre Maj 5 00:57:29 CEST 1999


Zdravo!

Od kar je Simon rekel da ni zadovoljen s hitrostjo povezave svoje
Win-Linux kombinacije mi ta zadeva ne da mira. Vzel sem si malo casa
in se lotil raziskave.

Najprej sem prebral HOWTO-je in vse kar sem na to temo nasel...sem
pricakoval da me bo nekje vmes kaj presvetlilo in mi razjasnilo zadevo. Pa
se ni zgodilo nic podobnega :-(( Edino kar svetujejo je sprememba
velikosti okna. Pa se to za primere kjer pride do napak pri prenosu.
Le-teh pa je pri meni prakticno nic. Tu in tam se zgodi kaksen trk.


eth0      Link encap:Ethernet  HWaddr 00:80:48:E8:37:A0
          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:39325 errors:0 dropped:0 overruns:0 frame:0
          TX packets:27680 errors:0 dropped:0 overruns:0 carrier:0
          collisions:3
          Interrupt:10 Base address:0xe000         


Naslednja moznost pohitritve sistema bi naj bila sprememba ure na vodilu.
Testi, ki jih je opravil avtor dokumenta EthernetHOWTO:

ISA Bus Speed (MHz)     Rx TTCP (kB/s)
        -------------------     --------------
        6.7                     740
        13.4                    970
        20.0                    1030
        26.7                    1075

Ti testi so narejeni na 486/40. Glede na to da se hitrosti zacnejo pri
740kB/s, najine (Simonove in moje) pa so precej nizje se v te teste nisem
spuscal. ISA vidilo zmore 40Mb/s. V casu ftp prenosa in testov s
pomocjo programa ttcp (ki ga vsi omenjajo kot THE referenco za
testiranje dejanske hitrosti povezave) nisem pocel nic. Torej bi vodilo na
moji 486/100 moralo biti sposobno prenasati tudi z 10Mb/s. Se mogoce
motim?
  
Za winse sem izbrskal Javansko verzijo ttcp-ja.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TEST %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Racunalnika: Ferdo= Pentium 133 + eth0=tulip (DECchip21040) (Comprex PCI)
	     Oscar= 486/100 + eth0=Comprex EN2000 (ISA)

Testiral sem vse mozne konfiguracije.

============================
1. Ferdo=Linux, Oscar=Win95
============================

-------------
Oscar->Ferdo:
-------------

oscar:

Transmit: 16777216 bytes in 25040 mili seconds= 670.017 KB/sec (5360.13
Kbps)

ferdo:

[root na ferdo bobo]# ttcp -sr
ttcp-r: buflen=8192, nbuf=2048, align=16384/0, port=5001  tcp
ttcp-r: socket
ttcp-r: accept from 192.168.0.2
ttcp-r: 16777216 bytes in 25.00 real seconds = 655.36 KB/sec +++
ttcp-r: 12086 I/O calls, msec/call = 2.12, calls/sec = 483.44
ttcp-r: 0.0user 0.6sys 0:25real 3%                  

-------------
Ferdo->Oscar:
-------------

ferdo:

[root na ferdo bobo]# ttcp -st oscar
ttcp-t: buflen=8192, nbuf=2048, align=16384/0, port=5001  tcp  -> oscar
ttcp-t: socket
ttcp-t: connect
ttcp-t: 16777216 bytes in 32.00 real seconds = 512.00 KB/sec +++
ttcp-t: 2048 I/O calls, msec/call = 16.00, calls/sec = 64.00
ttcp-t: 0.0user 0.3sys 0:32real 1%          

oscar:

Receive: 16777216 bytes in 32300 mili-seconds= 519.418 KB/sec (4155.35 
Kbps)


FTP pa je dal: Oscar->Ferdo: put->290.16kB/s, get->493.1kB/s
               Ferdo->Oscar: put->462.13kB/s, get->394.83kB/s
Prenasal sem binarno datoteko velikosti 3.6MB
Pri ftp-ju sem zabelezil maksimalno vrednost izmet treh
zaporednih poskusov. S tem sem vsaj delno eliminiral cas, ki ga porabi
racunalnik za dostop do diska (saj je ftpd imel zadevo ze v cache-u).

============================
2. Ferdo=Linux, Oscar=Linux
============================

-------------
Oscar->Ferdo:
-------------

oscar:

[root na oscar Utils]# ./ttcp -t -s ferdo
ttcp-t: buflen=8192, nbuf=2048, align=16384/0, port=5001  tcp  -> ferdo
ttcp-t: socket
ttcp-t: connect
ttcp-t: 16777216 bytes in 21.00 real seconds = 780.19 KB/sec +++
ttcp-t: 2048 I/O calls, msec/call = 10.50, calls/sec = 97.52
ttcp-t: 0.0user 21.5sys 0:21real 102%

ferdo:

root na ferdo Utils]# ./ttcp -r -s
ttcp-r: buflen=8192, nbuf=2048, align=16384/0, port=5001  tcp
ttcp-r: socket
ttcp-r: accept from 192.168.0.2
ttcp-r: 16777216 bytes in 22.00 real seconds = 744.73 KB/sec +++
ttcp-r: 11500 I/O calls, msec/call = 1.96, calls/sec = 522.73
ttcp-r: 0.0user 0.8sys 0:22real 3%  

-------------
Ferdo->Oscar:
-------------

ferdo:

[root na ferdo Utils]# ./ttcp -t -s oscar
ttcp-t: buflen=8192, nbuf=2048, align=16384/0, port=5001  tcp  -> oscar
ttcp-t: socket
ttcp-t: connect
ttcp-t: 16777216 bytes in 24.00 real seconds = 682.67 KB/sec +++
ttcp-t: 2048 I/O calls, msec/call = 12.00, calls/sec = 85.33
ttcp-t: 0.0user 1.4sys 0:24real 5% 

oscar:

[root na oscar Utils]# ./ttcp -r -s      
ttcp-r: buflen=8192, nbuf=2048, align=16384/0, port=5001  tcp
ttcp-r: socket
ttcp-r: accept from 192.168.0.1
ttcp-r: 16777216 bytes in 23.00 real seconds = 712.35 KB/sec +++
ttcp-r: 2396 I/O calls, msec/call = 9.83, calls/sec = 104.17
ttcp-r: 0.0user 8.8sys 0:23real 38%

FTP pa je dal: Oscar(X)->Ferdo(X): put->459.04kB/s, get->456.53kB/s 
	       Oscar->Ferdo(X): put->682.95kB/s, get->519.24kB/s
               Ferdo(X)->Oscar(X): put->490.00kB/s, get->679.81kB/s
	       Ferdo(X)->Oscar: put->603.55,get->679.58kB/s
	       Ferdo->Oscar: put -> 610.03kB/s, get->680.07kB/s

(X) pomeni da je racunalnik poganjal X-Windows.
Iz tega je razvidno da PCI kartica na Ferdu ne obremenjuje procesoja in
s tem posledicno ni odvisna od njegove obremenitve. Poleg tega je CPU na
Ferdu mocnejsi.


Se UDP povezava:

-------------
Oscar->Ferdo:
-------------

oscar:

[root na oscar Utils]# ./ttcp -tsu ferdo
ttcp-t: buflen=8192, nbuf=2048, align=16384/0, port=5001  udp  -> ferdo
ttcp-t: socket
ttcp-t: 16777216 bytes in 19.00 real seconds = 862.32 KB/sec +++
ttcp-t: 2054 I/O calls, msec/call = 9.47, calls/sec = 108.11
ttcp-t: 0.0user 18.4sys 0:19real 97%       

ferdo:

[root na ferdo Utils]# ./ttcp -sru
ttcp-r: buflen=8192, nbuf=2048, align=16384/0, port=5001  udp
ttcp-r: socket
ttcp-r: 16777216 bytes in 18.00 real seconds = 910.22 KB/sec +++
ttcp-r: 2050 I/O calls, msec/call = 8.99, calls/sec = 113.89
ttcp-r: 0.0user 0.2sys 0:18real 1%  

-------------
Ferdo->Oscar:
-------------

ferdo:

[root na ferdo Utils]# ./ttcp -stu oscar
ttcp-t: buflen=8192, nbuf=2048, align=16384/0, port=5001  udp  -> oscar
ttcp-t: socket
ttcp-t: 16777216 bytes in 14.00 real seconds = 1170.29 KB/sec +++
ttcp-t: 2054 I/O calls, msec/call = 6.98, calls/sec = 146.71
ttcp-t: 0.0user 0.4sys 0:14real 3%    

Tu se doseze optimum pri 9.14Mb/s. Torej relativno blizu teoreticnemu
maksimumu. V FAQ-ju pravijo da se hitrosti, ki so vecje od 1075KB/sec
tezko dosezejo - ni pa razlage zakaj. Ve kdo? Mogoce je to misljeno
konkretno za tisti racunalnik (ISO kartica in 486/40). 


oscar:

[root na oscar Utils]# ./ttcp -rsu
ttcp-r: buflen=8192, nbuf=2048, align=16384/0, port=5001  udp
ttcp-r: socket

disk nekaj pomelje in ostane pri temu. ISA karta v Oscar-ju ocitno ni
mogla pojesti vsega kar je poslal Ferdo. Sam TTCP pa ne dela kontrole
prenosa (UDP ne skrbi za pravilnost prenosa in zahteva da za to poskrbimo 
na visjem nivoju -> z aplikacijo). TCP pa pazi na to, da se vse pravilno
prenese -> vecji overhead -> pocasnejsi prenos.



============================
3. Ferdo=Win95, Oscar=Linux
============================

-------------
Oscar->Ferdo:
-------------

oscar:

[root na oscar Utils]# ./ttcp -st ferdo
ttcp-t: buflen=8192, nbuf=2048, align=16384/0, port=5001  tcp  -> ferdo
ttcp-t: socket
ttcp-t: connect
ttcp-t: 16777216 bytes in 24.00 real seconds = 682.67 KB/sec +++
ttcp-t: 2048 I/O calls, msec/call = 12.00, calls/sec = 85.33
ttcp-t: 0.0user 20.8sys 0:24real 87%  

ferdo:

Receive: buflen= 8192  nbuf= 2048 port= 5001
Receive connection from:
  Socket[addr=192.168.0.2,port=1024,localport=5001].
Receive: 16777216 bytes in 23450 milli-seconds = 715.446 KB/sec (5723.57
Kbps). 


-------------
Ferdo->Oscar:
-------------

ferdo:

Transmit: buflen= 8192  nbuf= 2048 port= 5001
Transmit connection:
  Socket[addr=oscar/192.168.0.2,port=5001,localport=1085].
Transmit: 16777216 bytes in 20870 milli-seconds = 803.892 KB/sec (6431.13
Kbps).
           
oscar:

[root na oscar Utils]# ./ttcp -sr
ttcp-r: buflen=8192, nbuf=2048, align=16384/0, port=5001  tcp
ttcp-r: socket
ttcp-r: accept from 192.168.0.1
ttcp-r: 16777216 bytes in 20.00 real seconds = 819.20 KB/sec +++
ttcp-r: 2058 I/O calls, msec/call = 9.95, calls/sec = 102.90
ttcp-r: 0.0user 8.7sys 0:20real 43%         


FTP pa je dal: Oscar->Ferdo: put->679.31kB/s, get->591.99kB/s
               Ferdo->Oscar: put->546,85kB/s, get->703.70kB/s

============================
4. Ferdo=Win95, Oscar=Win95
============================

-------------
Oscar->Ferdo:
-------------

oscar:
               
Transmit: buflen= 8192  nbuf= 2048 port= 5001
Transmit connection:
  Socket[addr=ferdo/192.168.0.1,port=5001,localport=1035].
Transmit: 16777216 bytes in 26690 milli-seconds = 628.596 KB/sec (5028.76
Kbps).

ferdo:

Receive: buflen= 8192  nbuf= 2048 port= 5001
Receive connection from:
  Socket[addr=192.168.0.2,port=1035,localport=5001].
Receive: 16777216 bytes in 26640 milli-seconds = 629.775 KB/sec (5038.2
Kbps).

                               
-------------
Ferdo->Oscar:
-------------

ferdo:

Transmit: buflen= 8192  nbuf= 2048 port= 5001
Transmit connection:
  Socket[addr=oscar/192.168.0.2,port=5001,localport=1027].
Transmit: 16777216 bytes in 33340 milli-seconds = 503.216 KB/sec (4025.73
Kbps).


oscar:

Receive: buflen= 8192  nbuf= 2048 port= 5001
Receive connection from:
  Socket[addr=192.168.0.1,port=1027,localport=5001].
Receive: 16777216 bytes in 33390 milli-seconds = 502.462 KB/sec (4019.7
Kbps).


FTP pa je dal: Oscar->Ferdo: put->458.14kB/s, get->528.54kB/s
               Ferdo->Oscar: put->461.97kB/s, get->353.56kB/s

=====================================================================
=====================================================================

Analiza povezave:

IEEE standard 802.3 predpisuje naslednjo strukturo podatkovnega okvirja:

- 7B Preamble (10101010*7) To dejansko tvori pravokotne impulze (zaradi
  Manchester kodiranja), ki omogocijo sinhronizacijo sprejemnikove ure.
- 1B Start of frame byte (10101011) - s tem se oznaci zacetek novega okna
- 6B destination address - naslov cilja
- 6B Source address - naslov izvora
- 2B Length field - pove koliko podatkov vsebuje okvir (1 do 1500B)
- 1-1500B Data - uporabni podatki
- 0-46B Pad - ce je podatkov manj kot 46B se uporabi Pad da zapolni okvir 
              do zahtevanega minimuma 64B (le-ta je dolocen zaradi
              detekcije trkov).
- 4B Checksum - omogoce detekcijo napak pri prenosu (npr.: v primeru suma
                na zici)   
-------------------------------------------------------------------------
Torej ima vsak "ethernet" paket 26B-tno "glavo", ce pa so podatki (XB)
manjsi od 46B, pa se dodatnih 46B-X bytov.
Zdrav razum in analiza pokazeta, da je kanal bolj ucinkovit ce se
uporabljajo cim daljsa okna. S tem se prenasa vec uporabnih podatkov in
manj "spremljevalnih podatkov". Ce sedaj teoreticno predpostavimo da 
uporabljamo maksimalno izkoriscenost okvirja (Data=1500B), dobimo idealni
prenos z naslednjim izracunom:

10Mb/s*(1500/(1500+26))=9.829Mb/s  

Toliko o 802.3.

Naslednja stopnicka je IP protokol.

IP datagram je sestavljen glave in podatkov. Glava je sestavljena iz
20B-nega fiksnega dela in spremenljivega dela, ki je opcijski. Maksimalna
dolzina glave je 60B. Recimo da vzamemo srednjo pot in predpostavimo da je
glava dolzine 40B.  

Temu se nato prilepi datagram TCP-ja. Le-ta razbije podatke, ki jih zelimo
prenasati na datagrame dolzine do 64KB. V praksi pa se ponavadi
uporabljajo datagrami dolzine okoli 1500B.

Ce upostevamo se glavo IP-ja, dobimo idealni prenos podatkov s hitrostjo:

10Mb/s*(1500/1500+26+40)=9.578Mb/s

============================================================================
   
Toliko o teoriji. Sedaj pa k analizi dejanskih testov.


Oscar(Linux)->Ferdo(Linux)

TCP buffer size pri oddajniku je 8192B. Ko TCP zadevo posreduje IP-ju se
buffer razbije na paketke po 1500B -> 5*1500B + 623B = 8192B. Ker
posiljamo 2048 paketov (Oscar ima zato 2048 I/O klicev), je skupno stevilo
IP paketov 12288.
Tu seveda jemljem prej predpostavljene vrednosti. Koliko "ethernet"
paketov bo tvorjenih?

Vsak paket ima priblizno 40B-tno TCP/IP glavo + 26B-tno "ethernet" glavo.
Zato da realno vsoto prenesenih podatkov naslednji izracun:

2048 buffer-jev % 8192B = 16.777.216B
12288 IP paketov * 40B  =    491.520B
--------------------------------------
skupno prenesenih podatkov = 17.268.736B

To se sedaj zapakira v "ethernet" pakete dolge 1500B. 
17.268.736B/1500B= 11512 "ethernet" paketov

Kar se dokaj natancno ujema s porocilom ttcp-ja (Ferdo ima 11500 I/O
klicev).

Iz tega rezulatata sklepam, da Oscar razbija in posilja zadevo idealno
(glede na velikosti paketov).  

Izracun dejanske hitrosti povezave:
2048 buffer-jev % 8192B = 16.777.216B
12288 IP paketov * 40B  =    491.520B
11512 "ethernet glav" * 26B = 299.312B
--------------------------------------
skupno prenesenih podatkov = 17.568.048B

To je 140544384b/22s=6.388.381b/s 

Uporabni podatki pa se prenasajo s hitrostjo 744.73 KB/sec=6.100.828b/s

4.5% hitrosti povezave gre torej na racun "pakiranja" in glav IP-ja in
802.3. 

Hitrost povezave pa je vseeno dalec od idealnih 9.578Mb/s. Zakaj?

Vidimo da Oscar porabi 10.5ms na en I/O klic. 10.5ms torej potrebuje da
sprocesira (razbije in poslje) en buffer dolzine 8192. Ferdo pa je vsak
I/O klic obdelal v 1.96ms.

Ce sedaj pogledamo prenos Ferdo->Oscar, takoj opazimo da ima Oscar samo
2396 I/O klicev. Zakaj je temu tako mi ni jasno, saj to namiguje da pakete
zdruzuje ze sam driver od mrezne kartice (kar pa nikakor ni logicno, ali
pac?)

V vsakem primeru je razvidno sledece:

Oscar->Ferdo: Oscar porabi 21.5s za sistemske zadeve, kar je 102% casa
              (Pove nam da ne more posiljati hitreje, ker ne utegne
               sprocesirati in dati na vodilo.)
	      Ferdo porabi 0.8s za s.z. pri sprejemu (3% casa)
Ferdo->Oscar: Ferdo porabi 1.4s za s.z., kar je 5% casa.
	      Oscar porabi 8.8s za s.z. pri sprejemu (38% casa)

Takoj ko je v igri Windows sistem, pa ni zadosti informacij za podrobnejso
analizo. Tako da je vse kar lahko pokazem, rezultati testov. Dejansko je
dovolj ce analiziramo samo Linux-Linux navezo, saj ze s tem dobimo jasno
sliko dogajanja. Vse ostalo pa je vpliv software-a. Tudi pri Linux-Linux
ftp prenosu se opazijo zanimive spremembe glede na obremenjenost sistema.
ISO kartica ocitno potrebuje precej procesorskega casa za svoje delo.
Spremeniti se torej v primeru pravilnega delovanja ethernet kartic in same
povezave ne da nic (popravite me ce se motim). 

==========================================================================
Nauk: Ne kupovati nicesar drugega, kot najboljsih ethernet kartic, saj je
drugace 10Mb/s samo napis na skatli. 
==========================================================================

Ce se pravilno spomnem je nekdo, ki je imel dve 3COM kartici v podobni
konfiguraciji kot jaz, ftp prenose reda 900KB.

Ker mi visoki procenti pri Oscarju niso dali mira, sem sel preveriti
njegov BIOS (racunalnik sem pred kratkim zamenjal z bratom in se v BIOS
nisem spuscal, ker je vse lepo delalo). Ugotovil sem da so vsi parametri
nastavljeni na "najpocasneje". Cache cikli, DRAM cikli, cakalna stanja na
vodilu (1/8 CLK). 
Vse sem nastavil na "hitreje". Za nas je predvsem zanimiva hitrost
vodila. Nastavil sem jo na 1/3 -> 100/3=33.3MHz (priporocena hitrost za
ISO vodilo bi naj bila 8MHz - po Ethernet FAQ. In pri tem naj bi zmogel
40MB/s. Ocitno ne zmore!??? Naj mi prosim nekdo tole razlozi. Kako je s
temi hitrostmi na vodilu. Nekoc sem to ze vedel, pa sem pozabil. Tega se 
mi pa ne da iskati :-). 


No, v tem primeru sem dobil:

------------
Ferdo->Oscar:
------------

ferdo:

[root na ferdo Utils]# ./ttcp -ts oscar
ttcp-t: buflen=8192, nbuf=2048, align=16384/0, port=5001  tcp  -> oscar
ttcp-t: socket
ttcp-t: connect
ttcp-t: 16777216 bytes in 21.00 real seconds = 780.19 KB/sec +++
ttcp-t: 2048 I/O calls, msec/call = 10.50, calls/sec = 97.52
ttcp-t: 0.0user 0.7sys 0:21real 4%          

oscar:

[root na oscar Utils]# ./ttcp -rs
ttcp-r: buflen=8192, nbuf=2048, align=16384/0, port=5001  tcp
ttcp-r: socket
ttcp-r: accept from 192.168.0.1
ttcp-r: 16777216 bytes in 22.00 real seconds = 744.73 KB/sec +++
ttcp-r: 2473 I/O calls, msec/call = 9.11, calls/sec = 112.41
ttcp-r: 0.0user 3.8sys 0:22real 17%     

Procenti za sistemske zadeve so padli iz 38% na 17%!

------------
Oscar->Ferdo:
------------

Ne gre! Oscar javi: eth0: bogus packet: status=0x80 nxpg=0x71 size=1518 


Hitrost vodila sem zato spremenil na 1/4 CLK, pa na 1/5, ....
Rezultati so se zelo spreminjali. Predvsem % za s.z pri Oscarju. Zato bom
se temu posvetil naslednjic. Malo bolj sistematicno. Med tem bom pocakal
se na vase komentarje. Upam, da bodo razjasnili se kaksno neznanko.



Se eni rezultati objavljeni na netu:

http://www.irus.rri.on.ca/~mjewison/speeds_classic.html


BTW: ttcp se nahaja tudi v Cisco routerjih.


LP,

	bobo

P.S.: Vse skupaj je narejeno zelo na hitro, tako da je mozno, da sem kje
"vzgal" cisto mimo. Ce se je zgodilo kaj taksnega in si to opazil, lepo
prosim da mi poves. 

P.P.S.: Ce si prisel do konca tega maila, si zasluzis eno pavzo za kavico
:-))

|-------------------------------------------------------------|
| Bostjan Vlaovic            | Student of Elect. Eng.         |
| Na zelenici 9              | http://imola.uni-mb.si/~bobo   |
| 3000 Celje, Slovenia       | Tel.: ++386 41 769-386         |
|-------------------------------------------------------------|















Dodatne informacije o seznamu Starilist