获取当前ruby进程内存使用情况

时间:2011-08-28 12:13:59

标签: ruby memory process

我想格式化我的Logger输出以包含当前内存使用情况,这是长时间运行过程的一部分。

Ruby有没有内置的东西,有点像PHP的memory_get_usage()?或者我是否必须执行一些shell命令才能从ps获取它?

7 个答案:

答案 0 :(得分:31)

NewRelic gem为许多操作系统和ruby运行时提供了MemorySampler class的简单RSS使用实现。

newrelic_rpm中加入Gemfile gem,然后调用它:

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

并返回当前进程作为RSS保存的内存兆字节数。

实现更喜欢可用的进程内计数器(jruby),在Linux上使用/proc/#{$$}/status,然后在其他地方回退到ps

答案 1 :(得分:30)

一年前尝试解决这个问题时,我做了很多在线研究和API挖掘,只能通过系统调用来解决它。

在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)

这将获取并将进程的驻留内存大小(以KB为单位)放入大小变量中。

只需付出一点努力就可以清理它,但大部分时间都花在调用ps并捕获其输出上,所以我认为这不值得花时间。

答案 2 :(得分:12)

通过使用反引号在像ps这样的Ruby上使用外部命令将在运行命令期间分叉当前进程。这意味着如果你的Ruby进程消耗300mb,那么你需要另外300mb来运行任何这些`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

答案 3 :(得分:7)

OS gem有一个rss_bytes方法。

答案 4 :(得分:6)

您可以简单地使用此put语句

puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip

答案 5 :(得分:0)

时间在流逝,现在有一个瑰宝:get_process_mem

require 'get_process_mem'
mem = GetProcessMem.new
puts "Memory used : #{mem.mb.round(0)} MB"

答案 6 :(得分:0)

此处以其他形式提及,但我发现这是最简单的咒语,至少在 Mac OS 上是这样:

`ps -o rss #{Process.pid}`.lines.last.to_i

来自man ps

rss   the real memory (resident set) size of the process (in 1024 byte units).