AIX RAM-Disk

Immer wieder einmal gerät man in eine Situation in der man eine RAM-Disk braucht, meist im Zusammenhang mit der Verarbeitung von vielen kleinen Dateien. Man kann eine solche RAM-Disk mit den AIX Mitteln problemlos anlegen. Allerdings gibt es einige Dinge zu beachten, wenn man auch wirklich den Geschwindigkeitsvorteil einheimsen möchte, den das Wort "RAM" verspricht.

RAM-Disk auf JFS2

Das mkramdisk Kommando legt im verfügbaren Speicher eines AIX Servers eine RAM-Disk an. Dabei arbeitet das Kommando sowohl mit 512 Byte Blöcken als auch mit den Größenangaben M und G. Die Größe der RAM-Disk kann nicht im laufenden Betrieb verändert werden. Für eine Änderung der Größe muß man sie deshalb neu anlegen. Der Speicher selbst ist pinned, wird also nicht in den Paging Space ausgelagert.

(0)cserver:/home/root/ 31# mkramdisk 4800M

/dev/rramdisk0

(0)cserver:/home/root/ 32#

Das Kommando legt zwei devices an, ein /dev/rramdiskX und ein korrespondierendes /dev/ramdiskX. Beachten Sie das einfache bzw. doppelte "r", die Unterscheidung wird später noch einmal wichtig.

(0)cserver:/home/root/ 33# ls -l /dev | grep ramd

brw------- 1 root system 48, 0 Mar 10 18:51 ramdisk0

crw------- 1 root system 48, 0 Mar 10 18:51 rramdisk0

(0)cserver:/home/root/ 34#

Im nächsten Schritt wird ein mountpoint und ein Dateisystem auf der RAM-Disk angelegt. Hier im Beispiel JFS2.

(0)cserver:/home/root/ 46# mkfs -V jfs2 -o log=INLINE /dev/ramdisk0

mkfs: destroy /dev/ramdisk0 (yes)? yes

logform: Format inline log for <y>?y

File system created successfully.

4895388 kilobytes total disk space.

Device /dev/ramdisk0:

Standard empty filesystem

Size: 9790776 512-byte (DEVBLKSIZE) blocks

(0)cserver:/home/root/ 47#

(0)cserver:/home/root/ 48# mkdir /tmp/ramdisk0

(0)cserver:/home/root/ 49#

Nun kann das Dateisystem gemounted werden

(0)cserver:/home/root/ 49# mount -V jfs2 -o log=/dev/ramdisk0 /dev/ramdisk0 /tmp/ramdisk0

(0)cserver:/home/root/ 50#

Unsere RAM-Disk ist fertig:

(0)cserver:/home/root/ 50# mount | grep ramd

/dev/ramdisk0 /tmp/ramdisk0 jfs2 Mar 10 19:03 rw,log=/dev/ramdisk0

(0)cserver:/home/root/ 51# df -m | grep ramd

/dev/ramdisk0 4800.00 4779.95 1% 4 1% /tmp/ramdisk0

(0)cserver:/home/root/ 52#

Soweit so gut. Nun kommen wir aber zu der Stelle, an der es interessant wird - wie schnell ist unsere RAM-Disk denn nun eigentlich? Wir schreiben für einen Test 1G aus /dev/zero in eine Datei auf die RAM-Disk

(0)cserver:/home/root/ 45# sync; date; dd if=/dev/zero of=/tmp/ramdisk0/1Gfile bs=1024k count=1000; date; sync; date

Thu Mar 10 19:09:07 NFT 2011

1000+0 records in.

1000+0 records out.

Thu Mar 10 19:09:26 NFT 2011

Thu Mar 10 19:09:27 NFT 2011

(0)cserver:/home/root/ 46#

Und jetzt lesen derselben Datei

(0)cserver:/home/root/ 49# time dd if=/tmp/ramdisk0/1Gfile of=/dev/null bs=10>

1000+0 records in.

1000+0 records out.

real 0m2.98s

user 0m0.02s

sys 0m2.91s

(0)cserver:/home/root/ 50#

19 bzw. 20 Sekunden für das Schreiben von 1 Gigabyte Daten? Das ist ziemlich enttäuschend. So ist die RAM-Disk nicht zu rechtfertigen. Also beginnen wir mit dem tuning, wie IBM es empfiehlt. Wir gehen davon aus, daß auf einer RAM-Disk ohnedies immer nur temporäre Daten liegen, deshalb verzichten wir auf die Aktualisierung der Access Time (noatime Option) und verringern so Zugriffe auf die inodes beim Lesen.

(0)cserver:/home/root/ 9# mount -V jfs2 -o log=/dev/ramdisk0 -o noatime /dev/>

(0)cserver:/home/root/ 11# e bs=1024k count=1000; date; sync; date <

Fri Mar 11 18:14:56 NFT 2011

1000+0 records in.

1000+0 records out.

Fri Mar 11 18:15:14 NFT 2011

Fri Mar 11 18:15:14 NFT 2011

und lesen:

(0)cserver:/home/root/ 14# time dd if=/tmp/ramdisk0/1GFile of=/dev/null bs=10>

1000+0 records in.

1000+0 records out.

real 0m2.12s

user 0m0.01s

sys 0m2.05s

(0)cserver:/home/root/ 15#

Wir sehen nur eine geringe Verbesserung beim Schreiben, die auch als Meßungenauigkeit durchgehen könnte, sowie eine leichte Verbesserung beim Lesen. Da sich die noatime Option auf das Lesen auswirkt war das so zu erwarten. Nichts destotrotz ist die Geschwindigkeit immer noch nicht so, wie man sich das bei der Nutzung von RAM vorstellt. Das muß doch noch schneller gehen. Leider hört die IBM Beschreibung der RAM-Diskkonfiguration bei den oben genannten Optionen auf.

Kommen wir also nun dazu, wie man eine RAM-Disk richtig auf Tempo hin konfiguriert. Die Ursache der schlechten Performanz ist, daß AIX die RAM-Disk wie ein normales Dateisystem behandelt. Dies bedeutet, daß das normale JFS Filesystem Caching stattfindet und die Daten zwischen Cache und RAM-Disk hin und her kopiert werden. Das kostet CPU, Speicher und viel Zeit. Also schalten wir das Caching der Daten im RAM ab, indem wir Direct I/O verwenden. DIO kam mit AIX 4.3 ins Betriebssystem.

(0)cserver:/home/root/ 38# mount -Vjfs2 -o dio,noatime,log=/dev/ramdisk0 /dev/ramdisk0 /tmp/ramdisk0

(0)cserver:/home/root/ 39# mount

node mounted mounted over vfs date options

-------- --------------- --------------- ------ ------------ ---------------

/dev/hd4 / jfs2 Mar 11 17:59 rw,log=/dev/hd8

(...)

/dev/ramdisk0 /tmp/ramdisk0 jfs2 Mar 11 18:33 rw,dio,noatime,log=/dev/ramdisk0

(0)cserver:/home/root/ 40#

Dieselbe Messung, erst schreiben einer Datei von 1 GB, dann lesen.

(0)cserver:/home/root/ 50# sync; date; dd if=/dev/zero of=/tmp/ramdisk0/1GFile bs=1024k count=1000 ; date; sync; date

Fri Mar 11 18:38:54 NFT 2011

1000+0 records in.

1000+0 records out.

Fri Mar 11 18:39:00 NFT 2011

Fri Mar 11 18:39:00 NFT 2011

(0)cserver:/home/root/ 51# time dd if=/tmp/ramdisk0/1GFile of=/dev/null bs=10>

1000+0 records in.

1000+0 records out.

real 0m2.93s

user 0m0.01s

sys 0m2.86s

(0)cserver:/home/root/ 52#

Das Schreiben ging diesmal in 6 Sekunden, was einer Verbesserung um den Faktor 3 entspricht. Beim Lesen hat sich der Wert gegenüber der gecachten Variante wieder verschlechtert und ist auf den Ausgangswert zurückgefallen. Daraus läßt sich als Faustregel ableiten:

Einschränkung

Manchmal hört man, daß ein Datenzugriff durch DIO langsamer geworden ist. Wenn man dann der Sache im Detail nachgeht stellt sich oft heraus, daß dies auf ein Problem mit der Blockgröße beim Zugriff zurückzuführen ist. Damit DIO seine Vorteile vollständig ausspielen kann muß der Zugriff idealerweise in derselben Blockgröße stattfinden, in der das Dateisystem angelegt ist. Bei AIX ist das wenn man nichts anderes angibt 4096 Bytes. Ggf. empfiehlt sich daher verschiedene Blockgrößen auszuprobieren, bis man die schnellste Kombination gefunden hat.

Externe Literatur zum Thema DIO

http://www.ibm.com/developerworks/aix/library/au-DirectIO.html

http://www.ibm.com/developerworks/wikis/download/attachments/53871915/Understand+DIO+v2.doc?version=2

RAM-Disk auf AIX 6.1

Ab AIX 6.1 kann man noch die NOLOG Option benutzen und sich das JFS2 Log völlig sparen: -o log=NULL. Damit wird der Schreibzugriff bzw. -durchsatz nochmals schneller.