Использование внешних команд на Ruby, таких как ps
, с помощью обратных кавычек приведет к разворачиванию текущего процесса на время выполнения команды. Это означает, что если ваш процесс Ruby потребляет 300 МБ, вам потребуется еще 300 МБ, чтобы запустить любое из этих `ps -o rss #{$$}`.strip.split.last.to_i
решений.
В системах на основе Linux вы можете получить информацию о памяти процесса, прочитав /proc/PID/statm
. Второе поле - это размер резидентного набора в количестве страниц ядра. Преобразование страниц RSS в байты требует от вас определения размера страницы ядра (скорее всего, 4096).
Вот пример кода, как получить rss в килобайтах, работает на Linux. Я не знаю, как это сделать на OSX или других системах.
module MemInfo
# This uses backticks to figure out the pagesize, but only once
# when loading this module.
# You might want to move this into some kind of initializer
# that is loaded when your app starts and not when autoload
# loads this module.
KERNEL_PAGE_SIZE = `getconf PAGESIZE`.chomp.to_i rescue 4096
STATM_PATH = "/proc/#{Process.pid}/statm"
STATM_FOUND = File.exist?(STATM_PATH)
def self.rss
STATM_FOUND ? (File.read(STATM_PATH).split(' ')[1].to_i * KERNEL_PAGE_SIZE) / 1024 : 0
end
end
# >> MemInfo.rss
# => 251944