Получить текущее использование памяти процесса ruby - PullRequest
51 голосов
/ 28 августа 2011

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

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

Ответы [ 5 ]

32 голосов
/ 09 июля 2014

Gem NewRelic предоставляет простые реализации использования RSS для ряда операционных систем и сред выполнения ruby ​​с их MemorySampler классом .

Включите камень newrelic_rpm в ваш Gemfile и вызовите его так:

NewRelic::Agent::Samplers::MemorySampler.new.sampler.get_sample

и возвращает количество мегабайт памяти, которое текущий процесс хранит в виде RSS.

Реализация предпочитает внутрипроцессные счетчики, где они доступны (jruby), используйте /proc/#{$$}/status в Linux и отступайте до ps везде.

30 голосов
/ 23 октября 2011

Когда я пытался решить эту проблему год назад, я провел много онлайн-исследований и копал 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 и захват его выходных данных, поэтому я не думаю, что оно того стоит.

12 голосов
/ 26 июня 2014

Использование внешних команд на 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
7 голосов
/ 16 мая 2012

В геме ОС есть метод rss_bytes.

6 голосов
/ 18 марта 2013

Вы можете просто использовать этот оператор put

puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...