我想格式化我的Logger
输出以包含当前内存使用情况,这是长时间运行过程的一部分。
Ruby有没有内置的东西,有点像PHP的memory_get_usage()
?或者我是否必须执行一些shell命令才能从ps
获取它?
答案 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).