Rails: 多機能ベンチマークgem「derailed_benchmarks」README(翻訳)

概要 MITライセンスに基づいて翻訳・公開いたします。 リポジトリ: schneems/derailed_benchmarks 原文更新日: 2018/03/25 著者: Richard Schneeman(schneems) サイト: https://www.schneems.com/ 画像はREADMEからの引用です。 Rails: 多機能ベンチマークgem「derailed_benchmarks」README(翻訳) RailsアプリやRubyアプリのさまざまなベンチマークを取ることができます。 「な・ん・と・か・し・て」 schneems/derailed_benchmarksより 互換性と要件 このgemはRails 3.2以上、Ruby 2.1以上でテストおよび動作確認しています。一部のコマンドはもっと古いRubyでも動くかもしれませんが、すべてのコマンドの動作についてはサポート外です。 一部のベンチマークについては(すべてではありません)、OSでcurlコマンドが実行できることを確認する必要があります。 $ which curl /usr/bin/curl $ curl -V curl 7.37.1 #… インストール Gemfileに以下を追加します。 gem ‘derailed_benchmarks’, group: :development 続いて$ bundle installを実行します。 このgemのコマンドを実行するとき、コマンドの前にbundle execをつけて実行する必要があるかもしれません。 利用可能なプロファイリング用メソッドをすべて追加するには以下も追加します。 gem ‘stackprof’, group: :development ライブラリのインストールにはRuby 2.1以降を使わなければなりません。これより古いバージョンのRubyをお使いの方は何を待っているんでしょうね? 使い方 アプリのベンチマークには2とおりの方法があります。derailed_benchmarksでは、Webアプリを起動してベンチマーク中にリクエストを実行することも、Gemfileにある依存関係の静的な情報を取得することもできます。精度についてはアプリを起動する方法の方が常に高くなりますが、productionローカルでアプリを実行できない事情がある場合は静的情報も役に立ちます。 静的なベンチマーク このセクションでは、アプリを起動する必要なしにGemfileからメモリ情報を取得する方法について説明します。 このセクションのすべてのコマンドは$ derailed bundle:で始まります。 メモリとパフォーマンスの関係については、How Ruby Uses Memoryをご覧ください。 require時に消費するメモリ プロジェクトにgemを追加するたびに、起動時のメモリ利用量が増加します。gemごとのメモリ使用量を表示するには、以下を実行します。 $ bundle exec derailed bundle:mem Gemfileにあるgemが読み込まれ、requireされたときに消費するメモリが表示されます。たとえば、mail gemを使っている場合の出力は次のようになります。 $ bundle exec derailed bundle:mem TOP: 54.1836 MiB mail: 18.9688 MiB mime/types: 17.4453 MiB mail/field: 0.4023 MiB mail/message: 0.3906 MiB action_view/view_paths: 0.4453 MiB action_view/base: 0.4336 MiB 補足: MiBは、IEEEやIECでメガバイトを表すシンボルであり、220 バイト / 1024キビバイト(結果は1024バイト)になります。 上の結果からmailが18MiBを消費していることがわかりますが、その大半はmime/typesで占められています。この情報を用いて、不要な依存関係を取り除けます。また、不要なgemが大量のメモリを消費していることに気がついたら、issueをオープンしてgemの作者に知らせてください(再現手順も添えること)。うまくいけばコミュニティがメモリのホットスポットを特定して影響を軽減できるでしょう。パフォーマンスの問題を修正する前に、問題がどこにあるのかを知っておく必要があります。 デフォルトでは、:defaultグループと”production”グループの結果だけを表示します。他のグループの結果を表示するには以下のように実行します。 $ bundle exec derailed bundle:mem development CUT_OFF=0.3のように指定することで、これよりメモリ使用量の大きいファイルだけを表示できます。余分な情報を抑制したい場合に便利です。 メモ: この方法では、Gemfileにある項目だけが表示されます。アプリそのものに含まれているファイルは含まれません。アプリそのものに含まれるファイルのメモリ使用量を表示するには、bundle exec derailed exec memを使う必要があります。詳しくは後述します。 複数のライブラリで同じファイルがrequireされていることがありますが、Railsではファイルのrequireは一度しか行わないため、そのファイルのコストは、あるファイルを最初にrequireするライブラリにのみ関連します。この点をわかりやすく表示するため、そのファイルが属しているすべての親で重複エントリを表示します。たとえば、mailとfogではどちらもmime/typesをrequireしているので、アプリでは次のように表示されます。 $ bundle exec derailed bundle:mem TOP: 54.1836 MiB mail: 18.9688 MiB mime/types: 17.4453 MiB (Also required by: fog/storage) mail/field: 0.4023 MiB mail/message: 0.3906 MiB トップレベルのライブラリ(ここではmail)を削除してもメモリ使用量が減っていないことがわかりました。出力では最初の2つのエントリ以後は省略されます。 fog/core: 0.9844 MiB (Also required by: fog/xml, fog/json, and 48 others) fog/rackspace: 0.957 MiB fog/joyent: 0.7227 MiB fog/joyent/compute: 0.7227 MiB fog/coreをrequireするファイルをすべて表示したい場合は、CUT_OFF=0 bundle exec derailed bundle:memを実行してすべてを出力してから手動でgrepすることもできます。 更新情報: 上の例のmime/typesは残念な結果が出ていますが、現在は修正されています。Gemfileの冒頭に以下を追加することでメモリを削減できます。 gem ‘mime-types’, [ ‘~> 2.6’, ‘>= 2.6.1’ ], require: ‘mime/types/columnar’ require時に作成されるオブジェクト … Continue reading Rails: 多機能ベンチマークgem「derailed_benchmarks」README(翻訳)