Подтвердить что ты не робот

Получить текущее использование памяти рубинового процесса

Я хотел бы отформатировать мой вывод Logger для включения текущего использования памяти для части долговременного процесса.

Есть ли что-то встроенное для Ruby для этого, немного похожее на PHP memory_get_usage()? Или мне нужно выполнить некоторые команды оболочки, чтобы получить их из ps?

4b9b3361

Ответ 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