加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 升级到Rails 4后,postgresql服务器上的内存泄

发布时间:2020-12-16 20:24:48 所属栏目:百科 来源:网络整理
导读:我们在Heroku上的Rails应用程序遇到了一个奇怪的问题. Juste从Rails 3.2.17迁移到Rails 4.0.3后,我们的 postgresql服务器显示了内存使用量的无限增加,然后在每个请求中返回以下错误: ERROR: out of memoryDETAIL: Failed on request of size xxx Juste在用r
我们在Heroku上的Rails应用程序遇到了一个奇怪的问题. Juste从Rails 3.2.17迁移到Rails 4.0.3后,我们的 postgresql服务器显示了内存使用量的无限增加,然后在每个请求中返回以下错误:
ERROR: out of memory
DETAIL: Failed on request of size xxx

Juste在用rails 4发布应用程序后,postgresql内存开始增加.

从下面的截图可以看出,它在3小时内从500 MO增加到了3,5Go以上

同时,每秒提交一倍.它每秒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 Cache.
>值得注意的宝石:延迟工作(4.0.0),主动管理员(主分公司),舒适的墨西哥沙发(1.11.2)

在我们的代码中似乎并不奇怪.

我们的postgresql配置是:

> work_mem:100MB
> shared_buffers:1464MB
> max_connections:500
> maintenance_work_mem:64MB

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

所有的帮助是非常欢迎的.

提前致谢.

解决方法

我不知道什么更好:回答我的问题或更新它…所以我选择回答.请让我知道如果更好的更新

我们终于找出了问题.自版本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)

它将不会为已更新的语句添加一个变量.所以它每次调用请求时都会生成一个准备好的语句. Rails处理具有最大大小为1000的池的准备语句.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读