上周,我们将一个运行在Rails 3.0.1上的小项目升级到了Rails 3.2.2。
升级后不久,我们意识到,偶尔,每天2-3次,我们会看到一个巨大的Phusion乘客进程(1-5 GB)。
我们运行的是Phusion Passenger 3.0.11和Ruby 1.9.3-p0。我们已经尝试了不同的Ruby版本(1.9.2-p290和1.9.3-p125),但都没有成功。
之后,我们尝试使用Oink跟踪内存使用情况。不幸的是,Oink没有显示内存膨胀的原因-大型进程似乎不再写入日志文件。
当我们降级回Rails 3.0.1时,这个问题就消失了。有没有人有类似的问题?我们真的检查了代码中可能的内存泄漏,比如太多的ActiveRecord实例,但没有发现任何内存泄漏。
你认为用Unicorn代替Passenger值得吗?或者我们很可能会遇到同样的问题?
欢迎任何关于如何跟踪内存泄漏的建议。我们已经设置了newrelic,但它没有显示有关内存泄漏的详细信息。
发布于 2013-03-15 23:03:06
如果这是兼容Red Hat的Linux,您可以使用SystemTap。我不确定在Debian/Ubuntu系统上是否可以使用SystemTap,如果没有的话,还有一种叫做DTrace的替代方案。这里有一些文章-我非常成功地跟踪了几个回归,尽管这些都不是内存问题(也许你可以找到一个STP脚本可以为你做这件事)。点击这里阅读:
http://lukas.zapletalovi.com/2012/02/peek-into-your-ruby-app-with-systemtap.html http://lukas.zapletalovi.com/2012/01/probing-ruby-apps-with-systemtap-in.html http://sourceware.org/systemtap/wiki/RubyMarker
最后一个链接展示了可以在Ruby语言的SystemTaps中使用的探测器。有一些想法,比如gc运行或内存分配,可以帮助你。祝好运!
发布于 2012-11-13 14:32:39
我想知道乘客内存统计数据显示了什么,以及您为PassengerMaxPoolSize PassengerPoolIdleTime和任何其他乘客设置的乘客内存类型。
您如何升级passenger?
你的apache设置是什么样的?prefork还是worker?
我怀疑你看到了糟糕的gc性能,尝试通过将以下代码放在passenger使用的ruby的包装器中来调整它们:
#!/bin/sh
export RUBY_HEAP_MIN_SLOTS=600000
export RUBY_GC_MALLOC_LIMIT=59000000
export RUBY_FREE_MIN=200000
exec "/usr/bin/ruby" "$@"它应该可以修复由于糟糕的ruby gc默认设置而导致的一些性能问题。
https://stackoverflow.com/questions/9500083
复制相似问题