Frissítés & fontos: A Cudaram jelenleg nem működik. A kutya ott van elásva, hogy maga a projekt több, mint négy éve nem változott. Nem ígérek semmit, de ahogy időm engedi, megpróbálom fixálni.
Tegyük fel, hogy a gépedben egy viszonylag modern videokártya foglal helyet, amit csak szabadidődben használsz, munka közben csak a Compiz piszkálgatja, amúgy unatkozik. Fogjuk munkára az unatkozó VGA memóriát és gyorsítsuk a rendszerünk!
Memóriából sosem elég, már csak a file cache miatt sem. Van, aki a szabad memória kapacitását egyszerűen befogja SSD-nek és azon dolgozik, van aki /tmp-nek csatolja és van, aki programot fordít benne (mondjuk ~7+ GB-nyi LibreOffice mókás :)). A lényeg, hogy sosem elég.
Én személy szerint van, amikor csúnyán kifutok a 2 GB-os keretből. Egy kis alkalmazás itt, egy virtuális gép ott, Firefox sok példányban sok tabbal, Clementine, Dropbox, Skype, közben Thunderbird csekkolja a leveleimet és ha épp kapok egy dokumentumot, már indul is a LibreOffice, mindezt 8 virtuális desktopra szétdobva. Nem is csoda, hogy kifutok a memóriából, aztán várhatok míg a lassú merevlemez swappol…
Részemről a plusz memória kihasználása mint lapozóterület a legoptimálisabb, tehát a feladat: csináljunk swapot a szabad VGA memóriából!
Összetevők:
- Futtatott kernel forrása
- nVidia driver 260.19.21-es vagy magasabb verziószámmal. Nem nouveau!
- CUDA egységgel rendelkező nVidia VGA
- gcc, automake, autoconf
- Cuda Toolkit
- Cudaram
A Cuda Toolkit letölthető az nVidia oldaláról (http://developer.nvidia.com/object/cuda_3_2_downloads.html), a Cudaram pedig a Githubról (https://github.com/peper/cudaram) szerezhető be, a többit a saját Linux disztribúciód szállítja.
A Cuda Toolkit telepítése egy egyszerű next-next-finish után kész is van.
A Cudaram telepítése sem sokkal bonyolultabb. Minden műveletet természetesen továbbra is rootként csinálunk.
0. Rand() a lelke mindennek, szóval dolgozzunk a /usr/src-be:
# cd /usr/src/
1. Klónozzuk le a Git repóból a forrást:
# git clone git://github.com/peper/cudaram.git
2. Futtassuk le a bootstrap-et:
# cd cudaram # ./bootsteap
3. Konfiguráljuk a forrást, pl.:
# ./configure --with-kernel=/usr/src/linux-2.6.36-gentoo-r5/ --with-cuda=/opt/cuda/
4. Fordítsuk le:
# make
5. Telepítsük:
# make install
6. Töltsük be a kernel modult:
# modprobe cudaram
7. Elvileg létrejött a /dev alatt 4 node cudaram0, cudaram1 és cudaramctl0, cudaramctl1 néven. Ha nincsenek, néz dmesg
-et, valami gond lehet.
8. Csekkoljuk le, mennyi memória van a VGA-nkon. Legegyszerűbben az nvidia-settings-ben lehet megnézni. Az lshw
és lspci
nem feltétlen ad hasznos választ.
9. Indítsuk el, a Cudaram modult vezérlő userspace programot:
A "0" a /dev alatti node száma, a 400 pedig a foglalandó memória mérete.
# ./cudaramd/cudaramd 0 400
Ha „[ERR] Allocating cuda data failed” üzenettel találkozol, semmi baj, csak túl sok memóriát akartál elvenni a VGA-tól. Csökkentsd a méretet.
Mielőtt befognánk swapnak, nézzük meg mekkora adatátviteli sebességet tud a rendszermemóriához képest. Én a /dev/urandom és dd
segítségével csináltam egy 250 MB-os állományt, amit másolgattam a ramdrive-ba.
10. Készítsük el a teszt állományt.
# dd if=/dev/urandom of=/ramdrive/test.iso bs=$((1000*1000)) count=250 conv=fdatasync 250+0 records in 250+0 records out 250000000 bytes (250 MB) copied, 33.8635 s, 7.4 MB/s
11. Memória -> Memória sebesség:
dd if=/ramdrive/test.iso of=/ramdrive/test2.iso bs=$((1000*1000)) count=250 conv=fdatasync 250+0 records in 250+0 records out 250000000 bytes (250 MB) copied, 0.343233 s, 728 MB/s
12. Formázzuk meg ext2-vel az új „partíciónkat”. Úgy viselkedik mint bármilyen más blokk eszköz:
# mkfs.ext2 /dev/cudaram0
13. Csatoljuk:
# mkdir /mnt/cudaswap # mount /dev/cudaram0 /mnt/cudaswap/
14. Másoljuk át rá a teszt adatokat:
# dd if=/ramdrive/test.iso of=/mnt/cudaswap/test.iso bs=$((1000*1000)) count=250 conv=fdatasync 250+0 records in 250+0 records out 250000000 bytes (250 MB) copied, 0.599043 s, 417 MB/s
Kb. fele olyan gyors mint a rendszer RAM és a PCIE 2-es szabványtól 83MB/s-el (500MB/s) le van maradva.
15. Hasonlítsuk össze a rendszerlemezzel:
# dd if=/ramdrive/test.iso of=/root/test.iso bs=$((1000*1000)) count=250 conv=fdatasync 250+0 records in 250+0 records out 250000000 bytes (250 MB) copied, 5.17288 s, 48.3 MB/s
Tehát, a fájlrendszer elérését ~8,6x-osára gyorsítottuk. Ha figyelembe vesszük, hogy esetleg „dugó” lehet az északi hídnál, akkor is legalább 8x gyorsabb elérése számíthatunk, mint a merevlemez esetén.
Az automatikus indításhoz berakjuk a kernel modul nevét (cudaram) a /etc/modules.autoload.d/kernel-2.6 állományba és csinálunk egy egyszerű init scriptet, ami elindítja a cudaramd-ot a megfelelő paraméterekkel és a fenti műveletet (formázás, csatolás) megcsinálja.
Párhuzamosan is lehet használni a régi és új swap partíciókat. Egyszerűen csak az /dev/cudaram0 -t swapként formázzuk és csatoljuk, valahogy így:
# mkswap /dev/cudaram0 # swapon /dev/cudaram0 -p 0
A -p paraméterrel be lehet állítani az előnyben részesítendő swap partíciót. minél nagyobb, annál hangsúlyosabban lesz használva.
swapon -s Filename Type Size Used Priority /dev/cudaram0 partition 368636 0 0 /dev/sda9 partition 4691964 0 -1