Rubyプロセスの使用メモリ量を計測したときの備忘録
psを使って計測する
psコマンドをRubyスクリプトから叩いて計測できますrss = `ps -o rss= -p #{Process.pid}`.to_i * 0.001
vsz = `ps -o vsz= -p #{Process.pid}`.to_i * 0.001
puts "Process: #{Process.pid}: RSS = #{rss} MB, VSZ = #{vsz} MB"
ObjectSpaceを使って計測する
ObjectSpaceはオブジェクトの情報を取得したり操作するモジュールです。ObjectSpace#memsize_of_allメソッドを使うと、全てのオブジェクトが使用しているメモリ量を取得できます。require 'objspace'
puts "#{ObjectSpace.memsize_of_all * 0.001 * 0.001} MB"
ObjectSpace#memsize_ofメソッドを使うと対象のオブジェクトが消費しているメモリ量を取得できます。
puts ObjectSpace.memsize_of(Hoge.new)
ただし、対象のオブジェクトが他のオブジェクトを保有している場合は、ポインタのメモリ量しか計測しないため、「対象のオブジェクトに関連する全てのオブジェクトのメモリ量ではない」ということに注意する必要があります。
関連する全てのオブジェクトのメモリ量を取得するには、reachable_objects_fromメソッドを使って関連するオブジェクトをたどる必要があります。詳細は以下のリンクを参照してください。
ActiveRecord vs Hash
3カラム10万レコードのHashとActiveRecordでメモリ使用量をObjectSpaceを使って比較してみました1..100_000.times {|i| records << {id: 1, int_field: 1, created_at: "2017-01-01"} }
# => 27M増加
1..100_000.times {|i| records << Hoge.new(id: 1, int: 1, created_at: "2017-01-01") }
# => 240M増加
9〜10倍くらいの差がありました。