| Jacob Sparre Andersen: EDB: Hurtigere Linux-netværk | [ Indhold ] |
|---|
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 +----------
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 +----------
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 +----------
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:
Et billede fylder typisk 50 kb (51200 byte), en webside 200 kb (204800 byte) og en hel cd-rom 700 Mb (734003200 byte).
+---------- | Hvis du for eksempel ofte læser LEGO-nyheder på | "www.lugnet.com", kan du med kommandoen `ping -c 10 | www.lugnet.com` sende 10 pakker af sted til | "www.lugnet.com" og få at vide hvor lang tid det i | gennemsnit tager før de er kommet tilbage til dig: | | $ ping -c 10 www.lugnet.com | PING lugnet.com (209.68.63.236): 56 data bytes | 64 bytes from 209.68.63.236: icmp_seq=0 ttl=224 time=178.523 ms | 64 bytes from 209.68.63.236: icmp_seq=1 ttl=224 time=199.020 ms | 64 bytes from 209.68.63.236: icmp_seq=2 ttl=224 time=192.648 ms | 64 bytes from 209.68.63.236: icmp_seq=3 ttl=224 time=182.294 ms | 64 bytes from 209.68.63.236: icmp_seq=4 ttl=224 time=191.363 ms | 64 bytes from 209.68.63.236: icmp_seq=5 ttl=224 time=174.299 ms | 64 bytes from 209.68.63.236: icmp_seq=6 ttl=224 time=185.835 ms | 64 bytes from 209.68.63.236: icmp_seq=7 ttl=224 time=176.469 ms | 64 bytes from 209.68.63.236: icmp_seq=8 ttl=224 time=209.673 ms | 64 bytes from 209.68.63.236: icmp_seq=9 ttl=224 time=179.289 ms | --- lugnet.com ping statistics --- | 10 packets transmitted, 10 packets received, 0% packet loss | round-trip min/avg/max = 174.299/186.941/209.673 ms | $ | | Det afgørende tal er det midterste tal på sidste | linie, 186,941 ms (ca. 0,187 s), der er | gennemsnittet af de 10 målinger. +----------
+---------- | Forbindelseshastigheder (typiske): | Modem...........................: 56 kbit/s = 19968 byte/s | ISDN............................: 128 kbit/s = 16384 byte/s | ADSL............................: 256 kbit/s = 32768 byte/s | Fast net (universiteter o.lign.): 100 Mbit/s = 13107200 byte/s +----------
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."
<jacob@jacob-sparre.dk>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/.