Migliorare le performance di Ruby on Rails
Provando spesso varie implementazioni dello stesso codice e leggendo articoli a riguardo si possono buttare giù alcune semplici considerazioni; innanzi tutto i tool di profiling sono essenziali per identificare quali parti di codice sono lente, è utile quindi utilizzarne per fare delle stime:
- Ruby profiler
- File di Log di Rails (debug level >= Logger::DEBUG)
- Rails Analyzer Tools (requires logging to syslog)
- Script Rails benchmarker (script/benchmarker)
- Tools del DataBase usato
- Apache Bench (ab or ab2)
- httperf
- Railsbench (download)
I parametri usati per stabilire e comparare le prestazioni:
- Latency: Quanto velocemente si soddisfa una richiesta
- Throughput: quante richieste si processano per secondo
- Utilization: quanto un server è in stato di Idle
- Costo dell’efficienza: performance per unità di costo
In generale è utile ottimizzare il codice Ruby questo significa intervenire su ogni singolo pezzo di codice dai modelli ai controllori alle viste. Quindi è opportuno utilizzare piccoli accorgimenti dalla scelta di metodi e classi già pronte fino all’utilizzo di espressioni regolari per parserizzare piccoli testi. Ma una delle cose più importanti è indubbiamente l’uso del caching. Un’applicazione Web è rallentata da tutto ciò che viene creato dinamicamente, per ovviare a questo problema la soluzione può essere il caching:
- Models cache
- MemCacheStore per le sessioni (plugin SessionStore)
- Page Cache
- Action Cache
- Page Cache frammentato
Inoltre per quello che concerne gli accesi al database è sempre utile utilizzare tutte le funzionalità dell’ActiveRecord come l’eager loading con l’ opzione :include. Se in alcuni casi vi sembra di poter ottimizzare una query SQL ricordate che si può usare il find_by_sql che oltre tutto evita il passaggio, fatto dal rails, di costruzione della query a partire dalle opzione passate al metodo find dell’ActiveRedord.
Tutte le volte che utilizzate un helper o un qualunque metodo fornito dal Rails avete l’indiscutibile vantaggio di rendere il codice particolarmente manutenibile e leggibile ma contemporaneamente aumentate il tempo necesario per servire la pagina, un esempio banale si ha nell’utilizzo degli helper nelle viste, più si usano più si aumenta il tempo di latenza (latency time).
Queste sono alcuni principi che si possono utilizzare per ottimizzare le proprie applicazioni, è chiaro che grazie alla scalabilità del rails se l’effettivo carico che l’applicazione dovrà sostenere sarà molto alto sar sufficiente aumentare l’hardware.
Quello che un’applicazioni male ottimizzata può subire come problema sono gli accessi al database, se, per aumentare le prestazioni, pittosto che ottimizzare il codice si aumentano le risorse si può arrivare ad un gap dovuto al massimo numero di connessioni gestibili con la vostra base di dati; per questo motivo se potete diminuite gli accessi il più possibile utilizzando gli include, come vi accenavo prima e le transazioni che consentono di fare inserimenti/modifiche/cancellazioni multiple così:
1 Vote.transaction do 2 my_votes_collection.each do |value| 3 Vote.create({:value => value}) 4 end 5 end
Per quanto riguarda il webserver provate a guardare LiteSpeed che è fornito in due versioni:
- Standard edition (free)
- Entreprise edition (a pagamento)


Per fare meno fatica, si potrebbe includere questo plugin nelle prime versioni dell’applicazione: http://agilewebdevelopment.com/plugins/acts_as_enterprisey
Mitico questo plugin!!
Strategy
Clients pay you to solve their technical problems. They want to feel like they’re getting their money’s worth.
Especially after you start submitting enterprisey invoices.