Créer un RamDisk sous OS X

décembre 21st, 2009
|

J’ai conscience ne pas vous révéler ici une astuce 0-day, je dirais même que c’est vieux comme le monde… si, si, c’était déjà possible sous OS9 avec vos 64Mb de Ram. Je vous re-sort directement cette astuce de mes vieux cartons, car aujourd’hui la mémoire vive est à un prix plus qu’abordable et que toute personne travaillant sur de gros fichiers: vidéos, dumps de toutes sortes, etc.. sait a quel point il est fatiguant d’attendre que le disque ai fini de gratter pour pouvoir travailler.

J’entends d’ici certain d’entre vous, dire « Mais #!$@, c’est quoi ce RamDisk ? » Et bien, comme son nom l’indique, il s’agit d’un disque dur virtuel travaillant directement sur la Mémoire vive de votre machine préférée… Oui, c’est sexy et très rapide !

Trêve de blabla, mettons en application et voyons ce que ça donne réellement. Ouvrez votre terminal page 1:

Chapitre 1. Créer un RamDisk de 1GB.

La commande dont nous aurons besoin pour créer ce disque se résume en une ligne:

1
2
3
4
5
6
$ diskutil erasevolume HFS+ "ramdisk" 'hdiutil attach -nomount ram://2330860'
Started erase on disk1
Unmounting disk
ErasingInitialized /dev/rdisk1 as a 1 GB HFS Plus volume
Mounting disk
Finished erase on disk1 ramdisk

« Mais attend c’est quoi ce chiffre, à la fin, tu nous parlais de 1Go !? » En réalité les partitions/volumes/images (rayez la mention inutile) sont composées de bloc de 512 Bytes. Pour calculer ce nombre de bloc (ici, 2330860 blocs pour 1Go recherché) il suffit d’une simple multiplication/division:

1
2330860 * 512 = 1.191.400.320. Soit 1 GB.

Donc la formule à utiliser est:

1
 NombreDeBlocs = (Taille du volume MB) * 2048

Voilà, notre disque est monté sur le Bureau et est directement exploitable. Pour l’éjecter, il suffit – comme pour tous les volumes sur Os X – de le jeter à la corbeille.

ATTENTION ! ATTENTION ! ATTENTION ! CECI N’EST PAS UN EXERCICE.

S’agissant d’un volume virtuel en mémoire, une fois éjecté, toutes les donnés présente à l’intérieur a ce moment-là son purement et simplement PERDUES. Il vous faudra les sauvegarder sur un support physique avant de le démonter… De plus, si votre ordinateur plante (kernel panic..) ou est éteint (coupure électrique..) la sanction est la même. Je vous aurais prévenu !
Il est possible (voir indispensable) de mettre en place un système de sauvegarde régulier (via cron, par exemple).. on ne va pas être idiot non plus :)

Petit rappel — De nos jours, nous utilisons souvent les termes bit, byte, octet, etc. Pourtant, certaines personnes semblent confondre les unités et me semble qu’un petit point récapitulatif serait de bon augure.

Il existe trois unités utilisées dans le monde de l’électronique et de l’informatique – mais seulement deux unités en pratique. L’unité de base est le bit, toujours écrit en minuscule: « b ». Le bit est l’unité binaire de base des ordinateurs (ayant pour valeur soit 0, soit 1). Puis viens le byte, noté en majuscule: « B ». Un byte est formé de 8 bits « b ». En France, le mot byte n’est pas utilisé et c’est l’octet « o » (en minuscule) qui est de mise (ndlr: théoriquement…). En simplifiant : 1 octet « o » = 1 byte « B » = 8 bits « b ».
A noter qu’en anglais, il faut se méfier de la confusion possible entre bit (bit) et byte (octet):
kb, Mb, Gb… signifient kilobit, mégabit, gigabit…tandis que que kB, MB, GB… signifient kilobyte, megabyte, gigabyte… Une erreur que l’on voit trop souvent !

Chapitre 2. Utilisation de la mémoire…

Voyons maintenant l’utilisation de la mémoire par le Ramdisk.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
utilisateur$ vm_stat
Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free:                         516790.
Pages active:                       106586.
...

utilisateur$ diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://2330860`
... Mounting disk

utilisateur$ cp /Users/tintin/Desktop/Mes_vacances.FRENCH.DVDRiP.XviD.avi /Volumes/ramdisk/

utilisateur$ vm_stat
Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free:                           2713.
Pages active:                       293000.
...

On voit clairement que tout est directement chargé en mémoire, inutile d’en dire plus. Passons maintenant directement aux tests de débit.

Chapitre 3. Tests de débit…

Notre avons vu comment créer le disque, voyons maintenant ce que ça donne en terme de performance par rapport à un disque « classique » (en l’occurrence il s’agit du disque 5400tr/mn d’un MacBook, certes pas le plus performant du marché, mais suffisamment représentatif pour ce test):

Test en ECRITURE sur le DISQUE PHYSIQUE

1
2
3
4
5
6
utilisateur$ time dd if=/dev/zero of=/Volumes/Macintosh\ HD/testfile bs=1024k count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 18.411572 secs (58.318 Mbytes/sec)
-----
real 0m18.829s, user 0m0.004s, sys 0m1.304s

Test en ECRITURE sur le RAMDISK

1
2
3
4
5
6
utilisateur$ time dd if=/dev/zero of=/Volumes/ramdisk/testfile bs=1024k count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 2.880844 secs (372.717 Mbytes/sec)
-----
real 0m2.907s, user 0m0.005s,sys 0m1.499s

Test en LECTURE sur le DISQUE PHYSIQUE

1
2
3
4
5
6
utilisateur$ time dd of=/dev/null if=/Volumes/Macintosh\ HD/testfile bs=1024k
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 13.821304 secs (77.687 Mbytes/sec)
-----
real 0m13.861s, user 0m0.006s, sys 0m1.018s

Test en LECTURE sur le RAMDISK

1
2
3
4
5
6
utilisateur$ time dd of=/dev/null if=/Volumes/ramdisk/testfile bs=1024k
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 1.812593 secs (592.378 Mbytes/sec)
-----
real 0m1.829s, user 0m0.005s, sys 0m1.176s

Pour un fichier de 1Go:

1
2
3
________| Disque Physique | Ramdisk _______
Lecture :  13.8s (77Mb/s) | 1.8s (592Mb/s)
Ecriture:  18.4s (58Mb/s) | 2.8s (372Mb/s)

Joli tableau, n’est-ce pas ? … Bref, les performances parlent d’elles mêmes !

Chapitre 4. Utilisation facile ?

Je vous livre un applescript et un script bash, trouvé sur macosxhints.com pour automatiser le biniou:

Applescript:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
tell application "Finder"
     activate
     display dialog "This script will create a RAM Disk on your desktop.
     How many megabytes would you like it to be?"
default answer "" buttons {"OK", "Cancel"} default button 1
     set diskSize to (text returned of the result)
     set diskSize to diskSize * 2048
     do shell script "hdid -nomount ram://" & diskSize
     set dskImg to the result
     
     set prevTextDelims to AppleScript's text item delimiters
     set AppleScript's text item delimiters to {"/"}
     set myDevDisk to the last text item of dskImg
     log result
     set myShellCmd to "/sbin/newfs_hfs /dev/r" & myDevDisk as text
     do shell script myShellCmd
     display dialog result
     do shell script "hdiutil mount /dev/" & myDevDisk
     set AppleScript's text item delimiters to prevTextDelims
end tell

Bash:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh
if [ $# -ne 1 ]; then
    echo " Usage: newRamDisk.sh <size in MB>"
    echo "Example: newRamDisk.sh 20"
    exit
fi
if [ $1 -lt 4 ]; then
    echo "Error: Size must be greater than or equal to four megabytes"
    exit
fi
ramDiskSize=`echo "${1}*2048" | bc`
echo "Allocating $ramDiskSize blocks"
ramDiskPath="/dev/r"`hdid -nomount ram://${ramDiskSize} | awk -F / '{print $3}'`
echo -n "Creating HFS Plus filesystem on $ramDiskPath"
newfs_hfs -v "Ram Disk" $ramDiskPath
echo "Mounting $ramDiskPath"
hdiutil mount $ramDiskPath

En résumé, à l’heure ou l’on peu se procurer un maximum de RAM pour un investissement réduit le Ramdisk peut être une solution intéressante pour ceux qui ont besoin de disques très – très – rapides. J’utilise régulièrement cette solution pour les espaces temporaires sur les serveur: /tmp sessions_php ou cache.

One Comment:

  1. Salut
    J’ai testé le script j’ai ca en sortie :

    sudo sh ramdisk.sh 50
    Password:
    Allocating 102400 blocks
    -n Creating HFS Plus filesystem on /dev/rdisk5
    Initialized /dev/rdisk5 as a 50 MB HFS Plus volume
    Mounting /dev/rdisk5
    hdiutil: mount failed – aucun système de fichiers montable

    As tu une idée ? Je suis sous snow leopard

    Merci d’avance

Leave a comment: