获取当前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