Rubyのパフォーマンス計測ツール

https://www.youtube.com/watch?v=cOaVIeX6qGg

1 comment | 0 points | by WazanovaNews 約1時間前 edited


Jshiike 約1時間前 edited | ▲upvoteする | link

Aaron Quintは、オンライン/オフラインで招待状やお祝いのカードを送るサービスであるPaperless PostのCTOです。GoRuCo 2014で、お薦めのRubyアプリのパフォーマンス計測ツールを紹介してくれてます。

評価の基準としては、

Specificity (Sp): アウトプットの内容がどれだけ詳細か。 Impact (Im): Probe Effectのレベル。計測が意図しないシステムの振る舞いにつながる可能性のある影響度合い。この数値が大きいと本番環境では使えない。 Difficulty of Operator Use (Op): ツールのセットアップおよび利用がどれだけやりやすいか。今回の場合は、数字が大きいほど簡単という意味。 Readability (Rd): アウトプットがどれだけわかりやすいか。 Realtimedness (Rl): どれだけ早く結果がでるか。

使い分けのコツとしては、

本番環境に影響の少ない(Im値が低い)ツールは本番データの収集に、インパクトの大きい(Im値が高い)ツールは開発/ステージング環境における改良の相対比較に利用するとよい。

1) ActiveSupport::Notificationsとその仲間

Rails 3から導入されたActiveSupport::Notificationは単にリアルタイムでのベンチマークという位置づけ。一つの箇所でイベントをパブリッシュして、別の箇所で、イベントのデータを収集して、ペイロードを繰り返し解析し、集計側に推定データを送る仕組み。

Sp: 5-10 Im: 5-10 Op: 7 Rd: 2-10 Rl: 9 - 素敵なグラフ表示機能。 - percentile表示に向いている。どの_layers_が遅いのか判別しやすい。 - 詳細がわからないので、誤った解釈をしてしまう可能性あり。

2) rblineprof

Ruby用のラインプロファイラー。各行がどれだけ実行時間がかかったか表示してくれる。

Sp: 9 Im: 9 Op: 8 Rd: 7 Rl: 3 - 開発者がすごく知りたいホットスポットを可視化してくれる。 - 実行に時間のかかる箇所を深堀するのに適している。 - ローカライズされた情報なので、システム全体の問題を発見したり、直したりするのには向かない。実数値ではない。

3) ppprofiler

一行のコードを繰り返し実行して、結果をマークダウンのレポートに表示してくれる。

Op: +2 加算 Rd: +2 加算 - 他のツールのシンプルなラッパー。ローカルで状況をトラック。 - 行単位で改善し、チームに状況をわかりやすく共有できる。 - ローカルでの利用が前提なので、本番環境用のツールではない。

4) stackprof

一番のお薦め。サンプリングプロファイラーについては、過去Googleがいくつか論文を発表しているが、Rubyにおいては新しいソリューション。Ruby 2.1での新しいAPIである rb_profile_frame で、メモリ/CPUのオーバーヘッドなしに、実行されているスタックの各時点での状況を収集できる。コードでどういうメソッドがどういう比率で実行されているか、何がホットスポットなのかを教えてくれる。

Sp: 4 Im: 2 Op: 3 Rd: 4-6 Rl: 9 - FlameGraphを使えば、わかりやすいビジュアルのグラフに仕上げてくれる。 - 本番環境のシステム的な問題を見つけるのに適している。 - コードのどの箇所が遅いのかについての詳細な情報は得られない。

5) stackprof-remote

Go言語のツールには、ミドルウェアをアプリにincludeして、コマンドラインから本番サーバに向けると、10秒後には本番サーバの情報をコマンドラインでインタラクティブに取得できるという便利なものがある。そのRuby版を開発。stackprofをコマンドラインでインタラクティブにナビゲートできるかたちに改良。

Op: +4 加算 Rd: +2 加算 Rl: +1 加算 - 本番サーバ上での調査が容易。 - 開発環境用ではない。

6) ObjectSpace

Ruby 2.1での新しいツール。dump_allを使えば、アプリを中断し、Rubyヒープのメモリにある全てのオブジェクトを書き出してJSONデータとしてファイルに落とせる。「メモリにある全部のオブジェクト」を簡単に取得する方法が他の言語にはあったが、Rubyにはなかった。

Sp: 10 Im: 10 Op: 3 Rd: 3 Rl: 2 - メモリの問題の詳細調査ができる。 - 稼働しているシステムからデータを取得してくるのは難しい。

7) objspace_viewer

Rd: +2 加算 - まだ開発途上。 - データは全部取得できているので、次は分析のための気の利いたツールが必要。

#ruby #パフォーマンス


Discourse : パフォーマンス向上に注力したRubyアプリづくり


Back