2017-04-04

Rubyプロセスの使用メモリ量の計測

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倍くらいの差がありました。

参考URL

このエントリーをはてなブックマークに追加