Green Rails January 09, 2008 22:18 over 2 years ago
I disse grønne miljø tider må man som udvikler tænke på mange ting. Denne gang vil jeg først og fremmest tænke på strømforbrug og etiske regelsæt når man konstruere og drifter systemer. Det ville være fedt at have små super hurtige systemer som kan fungere ved at minimalt energiforbrug. Jeg har i mange år haft mine egen dedikeret serverer men i lange tider står de faktisk næsten ubenyttet hen.
Nu behøver jeg ikke et top moderen drift center til mine små webapplikationer og EDI udveksling men jeg har alligevel sat et par mål.
- Hardwaren må ikke bruge mere en 10 Watt.
- Hardwaren må ikke være hørbar på en meter.
- Ingen service må tage mere end et halvt sekund.
Normalt vil de fleste bare have maksimal hastighed men det er faktisk ikke særligt sjovt, og det forbruger en masse strøm og udvikler dermed også en masse varme. Jeg har fx en Dell Laptop der bliver så varm at jeg ikke kan se film og samtidig ha den på lårene.
Ved at gå lidt ned i CPU hastighed og i stedet indføre multi-core chiplevel Multi Processor(CMP) kan man opnår en betragtelig udnyttelsesgrad men næsten ingen øgning i strømforbrug.
Nu er det selvfølgelig sådan at næsten ingen applikationer kan udnytte flere CPU kerner til fulde. Fx kan man se en Java proces udnytte den ene proces 100% på en dual core maskine mens den anden står ubenyttet i dvale.
Jeg har købt en linutop. Det er en lille box med superlavt strømforbrug og den er lydløs fordi der ikke er bevægelige dele i den. Reelt set er det kun et stykke printplade med nogle chips samlet i en aluminiums kasse. Den har ikke nogen harddisk eller andet som æder strøm eller skaber varme, kun CPU’en laver lidt varme. Boxen har en AMD Geode LX700 processor med 256 MB RAM og 4x USB 2.0 porter, audio og 10/100baseT Ethernet og VGA output. Den forbruger 5W.
Der findes ikke et operativ i boxen men jeg vil have linux på den. Derfor har jeg prepereret en USB nøgle med Mandriva, mit favorit linux styresystem gennem mange år. Mandiva kan installeres som fuld desktop eller server installation.
Når Linutop’en modtager en bootable USB med et operativsystem starter den en lille fin distribution op med linux kernel 2.6.22.9-desktop586-1mdv med grafisk KDE 3.5 grænseflade. USB’en køre perfekt på alle mine computere så længe den bruger de respektive interne ressource men på linutop er problemet den lille AMD processor og de kun 256 MB RAM.
Mandriva booter ikke default med sshd installeret og derudover er firewallen hermetisk lukket. Af gammel vane og for lidt ram skifter jeg ved samme lejlighed til et lavere runlevel i /etc/inittab, jeg har ikke brug for at logge grafisk ind over X.
Så er det ssh til boxen og installere noget software. Da softwaren er en fuldfed desktop udgave med 100vis af processer kørende og det tager lidt tid at finde alle de processer som jeg kan slukke uden det betyder noget for serveren. Her er resultatet, ca. 50 processer tilbage og lige over 60 MB fri mem. Når man ssh til boxen kan man fx starte drakconf, applikationen køre lynhurtige og kaster sit images på på den box hvor jeg er logget ind fra.
top - 01:45:20 up 45 min, 1 user, load average: 0.00, 0.00, 0.07 Tasks: 52 total, 1 running, 51 sleeping, 0 stopped, 0 zombie Cpu(s): 0.3%us, 0.3%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 235792k total, 171112k used, 64680k free, 15904k buffers Swap: 0k total, 0k used, 0k free, 131304k cached
Så er min lydløse USB computer ved at være parat til at få installeret software, jeg vil køre med ruby on rails, en webserver instans, en database og nogle kontrolstrukture til vedligehold og genstart af serverne.
frank@linutop www]# free -m
total used free shared buffers cached
Mem: 230 176 53 0 16 110
-/+ buffers/cache: 49 181
Swap: 0 0 0
Når det hele køre må det helst ikke fylder mere end ca. 40MB mem. Ruby er standard på mandiva men rubygems og ruby on rails er ikke. På samme måde skal der vælges en database. hmmm gerne en med lille footprint.
Normalt ville jeg benytte Apaches httpd server som webserver men da RAM er lidt begrænset vil jeg udskifte den med noget andet. Ofte fylder et kald til en apache instans op til ca. 20MB og det ville hurtigt slukke serveren. Min andet bud på en webserver er lighttpd, den er kendt for et specielt lille foodprint.
Mongrel er en hurtig HTTP server for Ruby som benytter ren HTTP fremfor FastCGI som de to andre bruger. Da alt software ligger på en USB nøgle vil jeg gerne undgå at compliere yderligere pakker som fx fcgi.
Thin er en ret ny og ret uprøvet webserver men da den er udviklet i ren ruby vil jeg alligevel forsøge mig med den. Den skulle være endnu hurtigere end Mongrel men jeg har også erfaret at den mister en tråd en gang i mellem. Det betyder at operativsystemet fanger en tråd som bruger en 10 til 15 procent af CPU’en. Efter 1 min bliver den piggybacked. Mongrel serveren bruger ca. 25 til 40MB i min opstilling her og det overrasker mig en smule at Thin bruger lidt mere. Om den i virkeligheden er hurtigere ved jeg ikke.
Som database vægler jeg Sqlite. Rails 2 vælger den som default og jeg er med på noget nyt, eneste rigtige showstopper med sqlite er for mange clienter til samme database men det er ikke et problem her.
Migrate af data fra mine gamle databaser til sqlite bliver også håndteret af ruby. Se post Mutible ActiveRecord. Som det ses er databasen på lige over 3 GB. Lidt sejt når der også er et linux system på flash nøglen.
[frank@linutop db]$ ll -h total 332K -rw-r--r-- 1 frank frank 10K 2007-01-25 01:09 dev.sqlite3 drwxr-xr-x 2 frank frank 4.0K 2008-01-02 23:04 migrate/ -rw-r--r-- 1 frank frank 3,6G 2008-01-04 15:04 production.sqlite3 -rw-r--r-- 1 frank frank 1.6K 2008-01-03 14:56 schema.rb
Så er det tid til at starte hele dynen. Jeg har lavet nogle scrips til start og stop af serveren og sat cron til at checke om den køre og hvis ikke starte den. I første omgang vil jeg bare køre en enkelt instans men det ser ud til jeg kan køre flere hvis det behøves. Underligt nok fylder en enkelt instans ca. 35 MB mens to fylder kun lidt mere?
Ulempen er hastigheden grunden den relativt lille mænge RAM. Stabiliteten har indtil videre være utrolig høj. Her er en kørsel efter næsten 4 døgn. Man kan se kthreadd har være aktiv, nok en tabt tråd fra Thin. Thin serveren bruger 33M og ser aktiv ud.
top – 21:54:36 up 9 days, 2:16, 1 user, load average: 0.12, 0.04, 0.01
Tasks: 57 total, 1 running, 55 sleeping, 1 stopped, 0 zombie
Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 235792k total, 231660k used, 4132k free, 22328k buffers
Swap: 0k total, 0k used, 0k free, 133180k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 1652 564 492 S 0.3 0.2 0:16.59 init10899 root 20 0 42596 37m 3088 S 0.3 16.3 89:30.20 thin
11576 frank 20 0 2160 972 796 R 0.3 0.4 0:00.09 top
2 root 15 -5 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 15 -5 0 0 0 S 0.0 0.0 0:01.61 ksoftirqd/0
Update
top - 18:46:21 up 43 days, 23:07, 1 user, load average: 0.06, 0.06, 0.01
Tasks: 57 total, 1 running, 55 sleeping, 1 stopped, 0 zombie
Cpu(s): 0.3%us, 0.7%sy, 0.0%ni, 99.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 235792k total, 231824k used, 3968k free, 16220k buffers
Swap: 0k total, 0k used, 0k free, 117904k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17282 frank 20 0 2160 976 796 R 0.7 0.4 0:01.71 top
12344 root 20 0 56464 51m 3092 S 0.3 22.2 713:56.60 thin
1 root 20 0 1652 564 492 S 0.0 0.2 1:06.82 init
2 root 15 -5 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 15 -5 0 0 0 S 0.0 0.0 0:02.68 ksoftirqd/0
5 root 15 -5 0 0 0 S 0.0 0.0 2:54.08 events/0
6 root 15 -5 0 0 0 S 0.0 0.0 0:00.04 khelper
29 root 15 -5 0 0 0 S 0.0 0.0 0:00.82 kblockd/0
30 root 15 -5 0 0 0 S 0.0 0.0 0:00.05 kseriod
Hvis du kan læse denne blog køre min linutop :-) Fascinerede lydløst
By Frank Vilhelmsen - 2 tags: linux server - Add comment
