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

我想格式化我的ps输出,以包括当前内存使用情况,这是长时间运行过程的一部分。

Ruby是否有内置功能,有点像PHP的ps? 还是我必须执行一些shell命令才能从ps获得它?

d11wtq asked 2020-01-24T03:07:29Z
5个解决方案
35 votes

NewRelic gem通过其/proc/#{$$}/status类为许多操作系统和ruby运行时提供了简单的RSS使用实现。

在您的ps中包含/proc/#{$$}/status gem,然后调用它:

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

它返回当前进程作为RSS持有的内存的兆字节数。

该实现倾向于使用进程内计数器(jruby),在Linux上使用/proc/#{$$}/status,然后在其他任何地方都使用ps

rud answered 2020-01-24T03:08:37Z
31 votes

一年前,当尝试解决此问题时,我进行了很多在线研究和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)

这将进程的驻留内存大小(以千字节为单位)放入并将其放入size变量中。

只需一点努力就可以清除,但是大多数时间是花在调用ps和捕获其输出上,所以我认为这不值得。

Paploo answered 2020-01-24T03:08:04Z
12 votes

通过使用反引号在Ruby上使用外部命令(如/proc/PID/statm)将在运行命令的过程中派生当前进程。 这意味着,如果您的Ruby进程消耗了300mb,则仅需另外300mb即可运行这些`ps -o rss #{$$}`.strip.split.last.to_i解决方案中的任何一个。

在基于Linux的系统上,您可以通过阅读/proc/PID/statm来获取进程内存信息。第二个字段是内核页面数中的Resident Set Size。 将RSS页转换为字节,需要您确定内核页的大小(很可能是4096)。

这是如何在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
Kimmo Lehto answered 2020-01-24T03:09:07Z
7 votes

操作系统gem具有rss_bytes方法。

rogerdpack answered 2020-01-24T03:09:27Z
6 votes

您可以简单地使用此puts语句

puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip
apandey846 answered 2020-01-24T03:09:47Z
translate from https://stackoverflow.com:/questions/7220896/get-current-ruby-process-memory-usage