Получить текущее использование памяти рубинового процесса
Я хотел бы отформатировать мой вывод Logger
для включения текущего использования памяти для части долговременного процесса.
Есть ли что-то встроенное для Ruby для этого, немного похожее на PHP memory_get_usage()
? Или мне нужно выполнить некоторые команды оболочки, чтобы получить их из ps
?
Ответы
Ответ 1
При попытке решить эту проблему год назад я провел много онлайн-исследований и копания API и смог решить ее только с помощью системного вызова ps.
Как в OS X 10.7.2, так и в Red Hat 4.1.2-13 (на EC2):
pid, size = `ps ax -o pid,rss | grep -E "^[[:space:]]*#{$$}"`.strip.split.map(&:to_i)
Это позволяет получить размер резидентной памяти процесса в килобайтах в переменной размера.
С небольшим усилием это можно было бы очистить, но большую часть времени тратит вызов ps и фиксирует его выход, поэтому я не думаю, что это стоит времени.
Ответ 2
Новая марка NewRelic предоставляет простые реализации использования RSS для ряда операционных систем и рубиновых версий с MemorySampler
class.
Включите камень newrelic_rpm
в свой Gemfile
и вызовите его таким образом:
NewRelic::Agent::Samplers::MemorySampler.new.sampler.get_sample
и он возвращает количество мегабайт памяти, текущий текущий процесс сохраняется как RSS.
Реализация предпочитает встроенные счетчики, где доступно (jruby), использовать /proc/#{$$}/status
в Linux и возвращаться к ps
везде.
Ответ 3
Использование внешних команд на Ruby, таких как ps
с помощью backticks, приведет к краху текущего процесса в течение всего времени выполнения команды. Это означает, что если ваш процесс 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
Ответ 4
У OS gem есть метод rss_bytes.
Ответ 5
Вы можете просто использовать этот оператор puts
puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip