【发布时间】:2014-01-31 16:01:58
【问题描述】:
运行一个相当大的 rails 应用程序,我们最近开始将其升级到 rails 3。
我们的堆栈是运行在 apache 之上的 ruby-1.9.3p484、rails 3.2.16 和乘客 4.0.23。
在我们的几台机器上产生了一些流量后,我们开始注意到出现了一些非常奇怪的错误。
诸如随机方法未定义在显然具有它们的对象上,实例变量在 AR 关联中为零,以及对象只是被随机替换为“假”。到处都是奇怪的行为。
检查 apache 的日志为我们提供了另一条信息,即当这些错误出现时,它们各自的进程通常也会在应用程序的随机位上崩溃。
有时它只是一个 ruby 节点作为 null 传入,有时它只是一些随机字符串溢出,只是随机的东西被弄乱了。
在测试过程中这些都没有发生,所以迄今为止唯一“可靠”的重现这种情况的方法就是向相应的机器抛出流量,看看它们何时/是否开始表现出这种行为。
在经历了所有这些之后,以下是我们迄今为止已排除的事情的清单:
- 乘客的 oob 垃圾回收
- rails 3 本身(显然我们之前也得到过这些,但它们之间的距离足够远,不会引发任何警报)
- 序列化/将东西推入和推出 memcached
- libxml - 有一些关于版本 2.5.0 导致内存损坏的报告,升级到 2.7.0 并没有真正产生影响
- 关闭预链接(这可能会导致内存损坏,根据 https://www.ruby-forum.com/topic/205897)
将 GC 设置恢复为 stock 似乎已经缓解了这个问题,但我们在这方面并没有任何决定性的结论。似乎收集越多,问题的发生率就越低。
对可能导致此问题的原因有什么想法,或者我们可以用来帮助我们查明问题吗?
【问题讨论】:
-
试试 Nginx 和 Unicorn 看看是否还有问题。我已经使用了很长一段时间的Passenger,但不知道我在生产中遇到的问题的根源(直到我摆脱了Passenger)
-
@Abdo 是的,似乎这也是我们的解决方案。太奇怪了。
-
是的.. 自从我做出改变以来,我从未如此快乐:-)
标签: ruby-on-rails ruby ruby-on-rails-3 passenger memory-corruption