derailed_benchmarks

参考:

schneems/derailed_benchmarks: Go faster, off the Rails – Benchmarks for your whole Rails app – GitHub

使い方

静的な解析

  • derailed bundle:mem:各 gem を require した時に確保されるメモリの容量
  • derailed bundle:objects:各 gem を require した時に確保されるオブジェクト

アプリケーションの解析

  • derailed exec --help:ヘルプを表示する
  • derailed exec perf:allocated_objects:確保されるオブジェクト数の変化
  • derailed exec perf:gc:GC のプロファイル
  • derailed exec perf:heap:ヒープの解析
  • derailed exec perf:ips:1秒当たりの実行回数
  • derailed exec perf:mem:各 gem を require した際のメモリ使用量
  • derailed exec perf:mem_over_time:メモリ使用量の時間経過
  • derailed exec perf:objects:確保されるオブジェクトのプロファイル
  • derailed exec perf:stackprof:メソッド呼び出しのプロファイル
  • derailed exec perf:test:リクエストの処理時間を計測する

参考:

多機能ベンチマーク gem「derailed_benchmarks」README 翻訳 | TechRacho

FrozenError

middlewaresfreeze されているのに変更しようとしてエラーが発生する。

FrozenError: can't modify frozen Array

対処法

eager_load を無効にする。

config.eager_load = false

production 環境で DerailedBenchmarkCLI が定義されている時は false にする。

# config/environments/production.rb
config.eager_load = !defined?(DerailedBenchmarkCLI) && true

参考:

FrozenError: can’t modify frozen Array when adding devServer middleware · Issue #1700 · rails/webpacker – GitHub

NoMethodError

DeprecationProxy 内で warn がエラーを起こす。

NoMethodError: private method `warn' called for nil:NilClass

原因

Kernel.require は本来 private であるが、gem 内でオーバーライドして public にしているため。

対処法

Kernel.requireprivate にする。

# derailed_benchmarks-1.3.5
# lib/derailed_benchmarks/core_ext/kernel_require.rb:62
Kernel.define_singleton_method(:require) do |file|
  measure_memory_impact(file) { |file| original_require(file) }
end
Kernel.send(:private, :require)

参考:

NoMethodError: private method `warn’ called for nil:NilClass · Issue #128 · schneems/derailed_benchmarks – GitHub

SystemStackError

Bootsnap を使用するとスタックがオーバーフローする。

SystemStackError: stack level too deep

原因

Bootsnap が定義する Kernel.require と derailed_benchmarks が定義する Kernel.require の呼び出しが循環している。

対処法

循環しないように Kernel.require を定義する。

# derailed_benchmarks-1.3.5
# lib/derailed_benchmarks/core_ext/kernel_require.rb:11
module Kernel
  # ...

  def require(file)
    Kernel.require_with_measure(file)
  end

  # ...

  def self.require_with_measure(file)
    measure_memory_impact(file) { |file| original_require(file) }
  end
end

# lib/derailed_benchmarks/core_ext/kernel_require.rb:62
Kernel.define_singleton_method(:require) do |file|
  Kernel.require_with_measure(file)
end
Kernel.send(:private, :require)
タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です