当前位置:  开发笔记 > 编程语言 > 正文

升级到Rails 4后,postgresql服务器上的内存泄漏

如何解决《升级到Rails4后,postgresql服务器上的内存泄漏》经验,为你挑选了1个好方法。

我们在Heroku上的Rails应用程序上遇到了一个奇怪的问题.从Rails 3.2.17迁移到Rails 4.0.3之后的Juste我们的postgresql服务器显示内存使用量的无限增加,然后它在每个请求上返回以下错误:

ERROR: out of memory
DETAIL: Failed on request of size xxx

Juste用rails 4释放应用程序后,postgresql内存开始增加.

正如您在下面的屏幕截图中看到的,它在3小时内从500 MO增加到3,5 Go以上

在此输入图像描述

同时,每秒提交加倍.它从每秒120次提交传递:

在此输入图像描述

每秒280次提交:

在此输入图像描述

值得注意的是,当我们重新启动应用程序时,内存会下降到正常值600 Mo,然后上升到3个以上后几个小时(然后每个sql请求显示"内存不足"错误).这就像杀死ActiveRecord连接在postgresql服务器上释放内存一样.

我们可能在某个地方有内存泄漏.但是:

它与Rails 3.2一起工作得非常好.也许这个问题是我们为了使我们的代码适应Rails 4和Rails 4代码本身所做的更改之间的联系.

在Rails 4升级后,每秒提交的数量增加似乎很奇怪.

我们的堆栈是:

Heroku,x2 dynos

Postgresql,Ika计划在heroku上

独角兽,每个实例3名工人

Rails 4.0.3

Redis缓存.

值得注意的宝石:延迟工作(4.0.0),活动管理员(在主分支上),舒适的墨西哥沙发(1.11.2)

在我们的代码中似乎没什么特别的东西.

我们的postgresql配置是:

work_mem:100MB

shared_buffers:1464MB

max_connections:500

maintenance_work_mem:64MB

有人在切换到Rails 4时遇到过这样的行为吗?我正在寻找重现的想法.

非常欢迎所有帮助.

提前致谢.



1> Antoine Joul..:

我不知道什么是更好的:回答我的问题或更新它...所以我选择回答.如果最好更新,请告诉我

我们终于找到了问题所在.从版本3.1开始,Rails就像User.find(id)这样的简单请求添加了预处理语句.版本4.0,为关联请求添加了预准备语句(has_many,belongs_to,has_one).例如以下代码:

class User
  has_many :adresses
end
user.addresses

生成请求

SELECT "addresses".* FROM "addresses" WHERE "addresses"."user_id" = $1  [["user_id", 1]]

问题是Rails只为外键添加准备好的语句变量(这里是user_id).如果您使用自定义sql请求

user.addresses.where("moved_at < ?", Time.now - 3.month) 

它不会为moving_at的预处理语句添加变量.因此,每次调用请求时它都会生成一个准备好的语句.Rails处理具有最大大小为1000的池的预准备语句.

但是,postgresql预处理语句不是跨连接共享的,因此在一两个小时内,每个连接都有1000个预准备语句.其中一些非常大.这导致postgreqsl服务器上的内存消耗非常高.


回答你自己的问题是可以的.你也应该接受它作为正确的答案.
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有