Коварный backtick или как определить размер используемой памяти

August 16, 2016

В одном жирненьком руби-воркере мы логировали размер памяти, которую расходует процесс, с помощью команды `ps -o rss -p #{$$}`. Такой способ легко найти в интернете и он обычно работает.

Однако сам Kernel#` сделан так, что он форкает руби процесс, соответственно на доли секунды резервируя еще столько же памяти, сколько процесс занимает уже. Наш воркер в ходе работы раздувался до 2.5-3GB и начал падать на 4GB оперативной памяти.

Я подсмотрел как сделано в ньюрелике (файл new_relic/agent/samplers/memory_sampler.rb):

proc_status_file = "/proc/#{$$}/status"
proc_status = File.open(proc_status_file, "r") {|f| f.read_nonblock(4096).strip }
proc_status =~ /RSS:\s*(\d+) kB/i
rss = $1.to_f 

На линуксе вместо запуска ps лучше использовать информацию из раздела /proc. Такой способ не требует избыточной памяти и работает у нас по сей день.

comments powered by Disqus