Коварный 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
.
Такой способ не требует
избыточной памяти и работает у нас
по сей день.