Velocizzare i test usando un RAM Disk

Dato che la RAM costa relativamente poco e il tempo invece è merce rara, mi pare una buona idea “investire” un po’ di RAM per risparmiare tempo. Se lavorate con una suite di test automatici probabilmente questa girerà decine di volte al giorno (forse addirittura all’ora) facendo una serie di operazioni su disco che, probabilmente, avranno un peso significativo sul tempo di esecuzione finale. Montando una porzione di RAM e utilizzandola come FS si può velocizzare l’esecuzione dei test.

Tre sono le cose che, se spostate in RAM, consentono un risparmio di tempo interessante:

  • Database
  • File di Log
  • Cache

Di queste il database è probabilmente la cosa più importante. La vostra suite di test unitari non dovrebbe dipendere dal database, ma probabilmente quella funzionale lo farà. A meno che la vostra applicazione non abbia esigenze particolari probabilmente potete rimpiazzare il classico MySql con un sqlite per l’ambiente di test. Questa dovrebbe già essere la vostra situazione se siete abituati ad usare LiipFunctionalTestBundle. Sqlite prevede la possibilità di creare il database direttamente in memoria (usando :memory: come dsn) ma questo approccio introduce degli svantaggi (non è possibile mantenere il db tra processi diversi ad esempio). Utilizzando un normale db sqlite creato all’interno di un FS RAM si ottiene un db persistente (può essere utile per debug oppure ottimizzazioni particolari) ma in ram.

Metto nell’elenco delle cose che tipicamente mi piace spostare in RAM anche cache e log perché sono gli altri due componenti che richiedono maggiori accessi a disco e che, tipicamente, non mi interessa mantenere nel tempo. Sono quindi candidati ideali per finire in RAM, sollevando il mio disco da inutile lavoro.

Per creare un RAM Disk su OSX basta lanciare il comando:

diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://1165430`

Che creerà una nuova partizione “ramdisk” disponibile in /Volumes.

Su macchine linux probabilmente la stessa cosa si può ottenere con un mount (non ho verificato questo comando):

mount -t tmpfs -o size=512M tmpfs /tmp/ram/

Per quanto riguarda sistemi windows invece non sono abbastanza ferrato da dare suggerimenti, ma sono pronto a scommettere che ci sia qualche utility disponibile per ottenere lo stesso risultato.

La quantità di spazio necessario dipende dalle vostre esigenze ma probabilmente qualche centinaio di MB saranno sufficienti.

Una volta creato il RAM Disk è necessario configurare Symfony per utilizzarlo per caching e logging. In Symfony2 la cosa è particolarmente semplice visto che il componente Kernel espone due parametri di configurazione proprio per questo, che basterà personalizzare (ad esempio nel parameters.ini):

  • kernel.logs_dir
  • kernel.cache_dir

In Symfony1 la stessa cosa dovrebbe essere fattibile modificando i parametri sf_cache_dir e sf_log_dir.

 

8 thoughts on “Velocizzare i test usando un RAM Disk”

  1. Confermo il comando, io l’ho usto con successo sotto Ubuntu (preceduto ovviamente da sudo). Per mia esperienza, il passo più difficile in questo approccio è la conversione del database da mysql a sqlite, che può creare parecchi grattacapi. Io ho adattato questo script per un mio db e ce l’ho fatta.

  2. interessante! a spanne di quanto si è velocizzata la tua test suite?

  3. Diciamo che dipende molto dalla velocità del disco, se hai la fortuna di lavorare con un SSD il vantaggio sarà minimo (li la questione è più che altro evitargli lavoro inutile) ma se parliamo di un disco normale potresti scendere tranquillamente a meno della metà.

  4. @Massimiliano Si, in certi casi poi non è proprio possibile passare a sqlite. In queste situazioni si potrebbe configurare mysql per usare il ramdisk ma non mi sono mai spinto così oltre.

  5. Qualcuno si è spinto oltre (google):

    - installo mysql su ramdisk
    /usr/local/mysql/scripts/mysql_install_db
    –basedir=/usr/local/mysql
    –datadir=/Volumes/ramdisk

    - aggiorno datadir
    /usr/local/mysql/bin/mysqld
    –basedir=/usr/local/mysql
    –datadir=/Volumes/ramdisk
    –log-error=/Volumes/ramdisk/mysql.ramdisk.err
    –pid-file=/Volumes/ramdisk/mysql.ramdisk.pid
    –port=3306
    –socket=/tmp/mysql_ram.sock

    - ti dumpi il db

    Non l’ho ancora provato a dire il vero, prima voglio vedere di quanto si velocizza la suite con ramdisk

  6. Io non amo usare per i test un database diverso da quello di produzione. Ho quindi messo direttamente mysql su ramdisk e devo dire che il miglioramento c’è.

    Qui trovate le indicazioni per Fedora e seguendo il link nella pagina anche per Ubuntu.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>