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

d11*_*wtq 52 ruby memory process

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

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

rud*_*rud 35

该宝石NewRelic的提供简单的RSS的使用实现了许多操作系统和Ruby运行时与他们的MemorySampler阶级.

newrelic_rpmgem 包含在您的中Gemfile并调用它:

NewRelic::Agent::Samplers::MemorySampler.new.sampler.get_sample
Run Code Online (Sandbox Code Playgroud)

它返回当前进程保存为RSS的内存兆字节数.

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


小智 32

在一年前尝试解决这个问题时,我做了大量的在线研究和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)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果你只是简单地用'ps -o rss -p#{$$}.chomp.split("\n").last.to_i`代替它可能会更容易 (10认同)
  • 正如另一个答案中所指出的,如果你的pid是1234并且还有另一个带有pid 12345的进程,这可能/会给你错误的结果. (2认同)

Kim*_*hto 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
Run Code Online (Sandbox Code Playgroud)

  • 这适用于旧版本的Ruby,但Ruby从2.0开始就是写入时复制(COW)友好. (3认同)

rog*_*ack 7

OS gem有一个rss_bytes方法.

  • 来自这个gem的代码更快,`ps -o rss = -p#{Process.pid}`.to_i在我的机器上大约6ms,最佳答案是大约11ms (2认同)

apa*_*846 6

你可以简单地使用这个put语句

puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip
Run Code Online (Sandbox Code Playgroud)