derailed_benchmarks
参考:
使い方
静的な解析
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
middlewares
が freeze
されているのに変更しようとしてエラーが発生する。
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
参考:
NoMethodError
DeprecationProxy
内で warn
がエラーを起こす。
NoMethodError: private method `warn' called for nil:NilClass
原因
Kernel.require
は本来 private
であるが、gem 内でオーバーライドして public
にしているため。
対処法
Kernel.require
を private
にする。
# 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)
参考:
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)