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并捕获其输出,所以我认为这不值得花时间.
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)
OS gem有一个rss_bytes方法.
你可以简单地使用这个put语句
puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24983 次 |
| 最近记录: |