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)