2013-04-30 6 views
17

あるいは、なぜ、ルビーのメモリをプロファイリングするための優れたツール、特にレールアプリがないのですか?なぜRubyでのメモリプロファイリングが難しいですか?

最近私たちのレールアプリ(herokuでホストされています)では、作業員のdynosでR14エラーが多数表示され始めました。これは私たちが記憶を使い果たしていることを意味します。 dynosを2倍(512MB→1GB)にするだけで問題が一時的に緩和され、どこかでメモリリークがあると私は信じていました。当然、私の次のステップは、漏れの原因を発見するのに役立つ良いプロファイリングの宝石を見つけることでした。

多分、私は利用可能なツールを知らないだけかもしれません。多分、私が持っているツールをどうやって使うのか分かりません。私の願いは、私は宝石をインストールして、メモリ使用統計に関するレポートを実行できるということです。私の記憶の問題は、遅延ジョブを実行している従業員のdynosに隔離されているため、レポートを取得するためにエンドポイントを打つことは実際には実行可能ではありません。

私はmemprofを見ましたが、1.8しかありません。

私はruby-prof(awesome)を見ましたが、メモリプロファイリングにはパッチされたruby intepreterが必要です。

私はGC::Profilerを見ましたが、メモリリークを見つける方法を理解できません。

したがって、ルビーでメモリリークを見つけるのは簡単ではありませんか?あるいは何とかしてポイントを逃していますか?

+1

https://github.com/bhb/rack-perftools_profilerをご覧ください。 –

+0

ありがとう[Dave S.](http://stackoverflow.com/users/845546/dave-s)、Webリクエストには便利ですが、私は稼動していないワーカーダイノスのプロファイルに役立つものが必要ですウェブコンテキスト。私が知る限り、rack-perftools_profilerはそれをサポートしていません。 –

答えて

3

"タイプ"に応じて、ルビーに対してvalgrindを実行できます。しかし、再コンパイルが必要になるかもしれません。一般的には、ルビはイベントを発生させることなくメソッドの割り当てを行うため、デフォルトでは難しいので、追跡するのは難しいです。 perftools.rb projectも参照してください。

+1

githubの上にいる良い人たちはこの空間で[何か面白いものを使っています](https://github.com/blog/1475-escape-velocity)しています。私はそれをチェックし、フォローアップします。 –

-3

私はRubyでのメモリプロファイリングが難しいと申します。 JVMには、地球上で最も優れたメモリプロファイリングツールがいくつかあり、RubyプログラムをJVM上で実行することができます。車輪を再構築しないでください。

+0

あなたはそれをとてもシンプルにする!私を教えてください。どのように、正確には、JVMでRubyアプリケーションをプロファイリングするのですか?フォローアップの質問:あなたのメソッドを使ってherokuワーカープロセスをどのようにプロファイルできますか? –

+0

@KevinCantwell:JRubyの主任開発者Charles Oliver Nutterによる古いブログ記事へのリンクを追加しました。 –

+0

多くのRailsアプリケーションはJrubyと組み合わせて動作しません。多くの宝石にはC拡張が必要です。確かに、それはすべての周りに働くかもしれませんが、プロセスは単純ではない、それは時間がかかります、そして、あなたは別の宝石を使用するとメモリリークを逃すかもしれません.. –

1

最近、私はウェブとバックグラウンドワーカーメソッドをプロファイルして、最適化のための機会を追い詰めるためにSkylightでいくつかの成功を持ってきました。あなたがこの質問を投稿したときは、おそらく周りにはなかったでしょう。欠点は、開発環境ではなく、ステージングやプロダクションでデバッグするのに本当に役立つだけなので、devループは非常に遅くなる可能性があるということです。

Sidekiqを使用している場合は、skylight-rubysidekiq-skylightの両方をインストールして、Webサーバーとバックグラウンドワーカーの両方でプロファイルを取得するようにしてください。

幸運を祈る!

関連する問題