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

我想格式化我的Logger输出,以包括当前的内存使用情况,作为一个长期运行的过程的一部分。

有没有什么内置的Ruby为此,有点像PHP的memory_get_usage() ? 或者我必须执行一些shell命令从ps

一年前,在试图解决这个问题时,我做了大量的在线调查和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) 

这会将进程的驻留内存大小以千字节为单位提取到大小variables中。

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

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

在你的Gemfile包含newrelic_rpm gem,然后调用它:

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

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

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

在Ruby上使用外部命令(如ps通过使用反引号将在运行命令期间分叉当前进程。 这意味着如果你的Ruby进程消耗了300MB,你将需要另外300MB来运行这些`ps -o rss #{$$}`.strip.split.last.to_i解决scheme。

在基于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 

OS gem有一个rss_bytes方法。

你可以简单的使用这个puts语句

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