2013-04-30 19 views
17

O meglio, perché non ci sono strumenti migliori per la profilazione della memoria in ruby, in particolare per le app per binari?Perché la profilazione della memoria nel rubino è così difficile?

Recentemente la nostra app per rotaie (ospitata su heroku) ha iniziato a vedere molti errori R14 nei dynos di lavoro. Questo significa che stiamo esaurendo la memoria. Bumping the dynos to 2x (512mb -> 1GB) ha solo alleviato temporaneamente il problema, portandomi a credere che ci sia una perdita di memoria da qualche parte. Naturalmente, il mio prossimo passo è stato trovare una buona gemma di profilazione che possa aiutarmi a scoprire la fonte della perdita.

Forse sono solo ignorante degli strumenti disponibili, o forse semplicemente non so come usare quelli che ho. Il mio desiderio è che potrei installare una gemma e quindi eseguire rapporti sulle statistiche di utilizzo della memoria. Colpire un endpoint per ottenere un report non è realmente praticabile in quanto i miei problemi di memoria sono isolati ai dynos dei lavoratori che eseguono lavori in ritardo.

Ho visto memprof, ma è solo 1.8.

Ho guardato a ruby-prof (impressionante), ma la profilazione della memoria richiede un interprete rubino patchato.

Ho visto GC::Profiler, ma non capisco come trovare perdite di memoria con esso.

Quindi, è semplicemente difficile trovare perdite di memoria nel rubino? O mi manca il punto in qualche modo?

+1

Controllare https://github.com/bhb/rack-perftools_profiler. –

+0

Grazie [Dave S.] (http://stackoverflow.com/users/845546/dave-s), che sembra utile per le richieste web, ma ho bisogno di qualcosa che mi aiuti a profilare i dynos di lavoro che non vengono eseguiti in un contesto web. Per quanto posso dire, rack-perftools_profiler non supporta questo. –

risposta

3

A seconda del "tipo" di fuga di notizie, È possibile corsa valgrind contro rubino. Potrebbe comunque richiedere la ricompilazione. In generale è difficile perché Ruby esegue l'allocazione del metodo senza attivare alcun evento, per impostazione predefinita, quindi è difficile da tracciare. Vedi anche perftools.rb project, che funziona in qualche modo attorno a questa limitazione.

+1

I bravi ragazzi di github hanno [usato qualcosa di interessante] (https://github.com/blog/1475-escape-velocity) in questo spazio.Controllerò e seguirò. –

-3

Non sono d'accordo sul fatto che la profilazione della memoria in Ruby sia difficile. La JVM ha alcuni dei migliori strumenti di profilazione della memoria sul pianeta ed è possibile eseguire i programmi Ruby sulla JVM. Non reinventare la ruota.

+0

Lo fai sembrare così semplice! Per favore, illuminami. In che modo, esattamente, si potrebbe fare una profilazione di un'app ruby ​​nella JVM? Domanda successiva: come può un profilo i processi di lavoro heroku usando il tuo metodo? –

+0

@KevinCantwell: aggiunti alcuni link ai vecchi post del blog dello sviluppatore principale di JRuby Charles Oliver Nutter. –

+0

Molte applicazioni Rails non funzioneranno in alcun modo con Jruby, molte gemme richiedono estensioni C. Certo, potrebbe essere tutto risolto, ma il processo non è semplice, richiede molto tempo e potresti anche perdere la perdita di memoria quando usi una gemma alternativa. –

1

Recentemente ho avuto un certo successo con Skylight al profilo web e dei lavoratori sfondo metodi e poi dare la caccia opportunità per l'ottimizzazione. Probabilmente non era in giro quando hai postato questa domanda. Il rovescio della medaglia è che aiuta davvero a eseguire il debug in staging o produzione, non in ambienti di sviluppo, quindi il ciclo di sviluppo può essere molto lento.

Assicurarsi di installare sia skylight-ruby e sidekiq-skylight per ottenere la profilatura sia sul server Web che sugli utenti in background se si utilizza Sidekiq.

Buona fortuna!

Problemi correlati