Tryllekunster for en hurtigere netværksforbindelse

Jeg har ofte siddet og undret mig over hvorfor jeg kun har kunnet presse omkring 10 Mbit/s igennem en netværksforbindelse, der på sit "tyndeste" sted har plads til hele 100 Mbit/s. En del af forklaringen kan selvfølgelig være at der er andre, der bruger de resterende 90 Mbit/s, men det er ikke nødvendigvis hele historien. Standardopsætningen af Linux er ikke altid optimal til overførsel af store datamængder over lange afstande, så jeg vil her komme med en opskrift på hvordan man kan justere sit Linux-system, så det klarer denne type opgaver lidt bedre.

+----------
| Enheder:
|   kbit   = 2^10 bit  =     128 byte
|   Mbit   = 2^20 bit  =  131072 byte
|   kb     = 2^10 byte =    1024 byte
|   Mb     = 2^20 byte = 1048576 byte
+----------

Hvor meget hukommelse vil du bruge på netværkstrafik?

Overvej hvor stor en del af hukommelsen i din maskine, du typisk vil kunne acceptere bliver brugt til netværkstrafik. Personligt har jeg valgt at sætte min grænse ved 40 Mb, hvilket betyder at jeg typisk vil have mindst 88 Mb til alt det andet, der foregår på maskinen. Grænsen er lidt tilfældigt valgt og kommer i høj grad an på hvor meget hukommelse de programmer du bruger i dit daglige arbejde har brug for.

+----------
| Hukommelsesforbrug:
|   Linux..........:  16 Mb
|
|   Gnome (inkl. X):  ?+25 Mb
|   KDE (inkl. X)..:  55 Mb
|
|   ABI Word.......:   ? Mb
|   Emacs..........:   5 Mb
|   GIMP...........:   ? Mb
|   Gnumeric.......:   ? Mb
|   Netscape.......:  20 Mb
|   Star Office....:  64 Mb?
+----------

Hvis du vil regne dig frem til hvor meget hukommelse du kan tillade dig at sætte af til netværkskommunikation er proceduren:

Hvis du vil prøve dig frem, så er det der kendetegner at du har brugt for meget hukommelse til netværkskommunikationen at maskinen bruger mere tid på at kopiere data og programmer frem og tilbage mellem hukommelse og disk.

+----------
| Eksempel:
|   Hukommelse i maskinen....: 128 Mb
|   Linux....................: -16 Mb
|   KDE (inkl. X)............: -55 Mb
|   Forskelligt andet........: -17 Mb
|   ---------------------------------
|   Til netværkskommunikation:  40 Mb
+----------

Indstilling af den øvre grænse for hukommelsesforbruget per netværksforbindelse.

Vi går nu ud fra at du har fundet ud af hvor meget hukommelse du kan/vil bruge på netværkskommunikation. Resten af opgaven er blot at give beskeden videre til Linux-kernen.

Linux vil have en øvre grænse for hukommelsesforbruget per netværksforbindelse, så det er nødvendigt at vi dividerer den samlede hukommelse vi vil bruge på netværkskommunikation med det typiske antal netværksforbindelser. Det er min erfaring at der sjældent er mere end 5 samtidige netværksforbindelser, så vi dividerer den samlede hukommelse til netværkskommunikation med 5, for at få grænsen per netværksforbindelse.

En anden vigtig detalje er at Linux forventer at få tallet i byte, så hvis du indtil nu har regnet i Mb skal du huske at gange med 1048576.

+----------
| Eksempel (fortsat):
|   Hukommelse per netværksforbindelse: 40 Mb/5 = 8 Mb
|                                               = 8388608 byte
+----------

Man meddeler Linux de øvre grænser for hukommelsesforbruget per ind- og udgående netværksforbindelse ved at skrive tallet til filerne "/proc/sys/net/core/rmem_max" og "/proc/sys/net/core/wmem_max". Hvis det skal gøres per automatik, når systemet starter, kan man med fordel sætte to kommandoer, der gør det ind sidst i filen "/etc/rc.local".

+----------
| Eksempel (fortsat):
|   $ su - root
|   Password:
|   # echo 'echo 8388608 > /proc/sys/net/core/rmem_max' >> /etc/rc.local
|   # echo 'echo 8388608 > /proc/sys/net/core/wmem_max' >> /etc/rc.local
|   # exit
|   logout
+----------

Indstilling af det normale hukommelsesforbrug per netværksforbindelse.

Nu har vi givet systemet den øvre grænse for hvor meget hukommelse, der må bruges på netværksforbindelser. Det næste skridt er at rette standardindstillingerne til, så de er optimale i forhold til din netværkskommunikation.

Udvælg nogle af de steder på nettet, hvor du synes kommunikationen går lidt langsomt. For hver af dem skal du finde/måle/gætte/vurdere følgende:

Lav nu en tabel med seks søjler. I den første sætter du navnene på de steder/maskiner på nettet du valgte at bruge som eksempler. I de næste fire sætter du tallene fra listen ovenfor. Og i den sidste søjle sætter du det mindste af tallene fra punkt 1 (husk at de skal være i byte) og punkt 4.

Eksempel (fortsat):
Sted Filstørrelse Tur-retur-tid Forbindelseshastighed Optimal bufferstørrelse Mindste størrelse
www.sslug.dk 600000 byte 0,017200 s 13107200 byte/s 225444 byte 225444 byte
www.lugnet.com 200000 byte 0,186941 s 13107200 byte/s 2450273 byte 200000 byte
sys-323.risoe.dk 27060784 byte 0,005320 s 1310720 byte/s 6973 byte 6973 byte

Det største af de tal vi kommer frem til ude i den sidste søjle er den mængde hukommelse vi bør reservere per netværksforbindelse, for at vi kan udnytte vores ressourcer optimalt. Hvis dette tal er større end den øvre grænse vi kom frem til i forrige afsnit er vi selvfølgelig bundet af den øvre grænse og bliver nødt til at bruge den som det normale hukommelsesforbrug per netværksforbindelse.

Parallelt med hvordan det gøres for de øvre grænser meddeler man Linux det foretrukne normale hukommelsesforbrug per ind- og udgående netværksforbindelse ved at skrive tallet til filerne "/proc/sys/net/core/rmem_default" og "/proc/sys/net/core/wmem_default". Hvis det skal gøres per automatik, når systemet starter, kan man med fordel sætte to kommandoer, der gør det ind sidst i filen "/etc/rc.local".

+----------
| Eksempel (fortsat):
|   $ su - root
|   Password:
|   # echo 'echo  225444 > /proc/sys/net/core/rmem_default' >> /etc/rc.local
|   # echo 'echo  225444 > /proc/sys/net/core/wmem_default' >> /etc/rc.local
|   # exit
|   logout
+----------

Hvis vi gerne vil aktivere de nye valg af hukommelsesforbrug til netværkskommunikation med det samme, kan vi (med systemoperatørrettigheder) køre de fire kommandoer vi har føjet til "/etc/rc.local" direkte fra kommandolinien.

+----------
| Eksempel (fortsat):
|   $ su - root
|   Password:
|   # echo 8388608 > /proc/sys/net/core/rmem_max
|   # echo 8388608 > /proc/sys/net/core/wmem_max
|   # echo  225444 > /proc/sys/net/core/rmem_default
|   # echo  225444 > /proc/sys/net/core/wmem_default
|   # exit
|   logout
+----------

God fornøjelse,

Jacob

-- 

"Historien bliver skrevet af vinderne,
 så jeg skriver historie."

Skrevet af:
Jacob Sparre Andersen <jacob@jacob-sparre.dk>
Inspireret af:
Brian L. Tierneys artikel TCP tuning guide for distributed application on wide area networks fra ;login: 26-1. En opdateret udgave kan læses på http://dsd.lbl.gov/TCP-tuning/.
Kopiering:
Denne artikel må frit kopieres.
Senest opdateret:
14. juli 2007