Seća li se neko Borlandovog Turbo C-a 2.0? Kada se pojavio, bilo je to definitivno najveće otkriće nakon sliced bread-a. Promeniš Destination sa Disk na Memory, stisneš F9 i dok kažeš "keks" poruka Finished veselo skakuće u info prozoru. I sve to na "zverskom" i80286/10MHz/4MB RAM-a. A danas?
Danas imamo računare koji su tri reda veličine brži, a prevođenje i pakovanje J2EE aplikacije može da se pretvori u mučan proces (pogotovo ako ste test-infected developer). Ako strpljenje nije deo vašeg genetskog materijala (a pri tome niste ljubitelj popularne real-time društvene igre "Srbija na međi vekova") možete se smatrati srećnim ako prođete samo sa nekim blažim psihosomatskim oboljenjem. Usko grlo procesa je očigledno pristup disku i ovaj tekst ima za cilj da prikaže jedan od načina da ga svedete na minimum.
First things first... Proverimo da li u kernelu postoji podrška za RAM disk:
damjan@attika:~$ dmesg | grep RAMDISK
i ako je sve u redu bićete pozdravljeni sa:
RAMDISK driver initialized: 16 RAM disks of 16000K size 1024 blocksize
Ukoliko poruke o inicijalizaciji ramdisk drajvera nema, a koristite monolitan kernel, potrebno je prevesti kernel sa uključenom podrškom za RAM disk (Device Drivers -> Block devices -> RAM disk support). Veličina RAM diska se određuje prilikom podizanja sistema, postavljanjem kernel parametra ramdisk_size. Sledi primer /etc/lilo.conf (akcenat je na append = "ramdisk_size=128000"):
boot = /dev/hda bitmap=/boot/lilo.bmp bmp-colors = 15,,0;5,,15 bmp-table = 60,15,1,4 bmp-timer = 69,29,6,8,0 prompt change-rules reset vga = 794 image = /boot/vmlinuz append = "ramdisk_size=128000 splash=silent" label = Slackware initrd = /boot/initrd read-only root = /dev/hda1
U slučaju da ipak preferirate modularne kernele, pokušajte sa ručnim učitavanjem ramdisk modula (ako ne upali, potrebno je da prevedete RAM disk kernel modul rd):
root@attika:~# modprobe rd rd_size=128000
Veličinu parametra rd_size odaberite u skladu sa svojim potrebama, u ovom slučaju je 128 Mb dovoljno da stane jedna instanca JBoss-a (bez dokumentacije i drugih "viškova") i ciljni direktorijum koji koristi Ant build skript. U ovom slučaju korišćenje modularnog kernela ima malu prednost jer se veličina RAM diska može promeniti bez ponovnog pokretanja računara - sa rmmod uklonite modul i ponovo ga učitate sa novom vrednosti parametra rd_size.
Sada je potrebno pripremiti mount point za naš RAM disk:
root@attika:~# mkdir /ramdisk root@attika:~# chmod 770 /ramdisk root@attika:~# chown damjan:users /ramdisk
Zatim treba kreirati fajl sistem. Pošto nam žurnalizacija baš i neće biti od velike koristi :), ext2 se čini kao dobar izbor:
root@attika:~# mkfs.ext2 -v -m 0 /dev/ram0
Po default-u, mkfs.ext2 rezerviše 5% blokova za super-usera (što u ovom slučaju nije potrebno) pa otuda i ono -m 0. Izlaz bi trebalo da bude nešto poput:
mke2fs 1.35 (28-Feb-2004) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 32000 inodes, 128000 blocks 0 blocks (0.00%) reserved for the super user First data block=1 16 block groups 8192 blocks per group, 8192 fragments per group 2000 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 Writing inode tables: done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 31 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.
Konačno i sam mount:
root@attika:~# mount -o noatime /dev/ram0 /ramdisk
Platforma za testiranje bio je AMD XP 2600+ sa 1GB RAM-a od čega je za RAM disk rezervisano 128Mb. Ciljni aplikativni server je JBoss 3.2.3, dok je za prevođenje i pakovanje korišten Ant. Originalni build skript je modifikovan za potrebe testiranja tako da se na RAM disk smeštaju:
Mereno je vreme potrebno za prevođenje, pakovanje i deployment dobijenog .ear-a (znači od pokretanja Ant skripta do trenutka kada JBoss kaze deployed). Upotrebom RAM diska se ukupno vreme smanjilo sa 3 minuta na 50 sekundi.
Priča ovde za mene staje, a za vas bi tek trebalo da počne. Eksperimentišite. Ako vam đavo bas ne da mira mozete i izvorne .java fajlove držati na RAM disku (ili, kao neki hacker wannabe, kompletan home direktorijum i /tmp particiju:)), ali to već zahteva postojanje odgovarajućeg cron taska za "tihi backup".
Happy coding!
P.S. Nisam se nešto preterano udubljivao (pa se u tom smislu ograđujem od sledeće konstatacije), ali vidim da Windows nema standardni RAM disk drajver i da postoji gomila 3rd party rešenja, pa bi bilo lepo da od nekoga ko se time pozabavio čujemo reč-dve.