升级到Rails 4后,postgresql服务器上的内存泄漏
我们在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缓存。
- 值得注意的gem:延迟工作(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)
它不会为moving_at的预处理语句添加变量。 因此,每次调用请求时,它都会生成一个预准备语句。 Rails处理具有最大大小为1000的池的预准备语句。
但是,postgresql预处理语句不会在连接之间共享,因此在一两个小时内,每个连接都有1000个预准备语句。 其中一些非常大。 这导致postgreqsl服务器上的内存消耗非常高。
- Heroku运行rake db:迁移错误,“没有这样的文件加载 – bundler / setup”
- GroupingError:错误:列“”必须出现在GROUP BY子句中或用于聚合函数
- npm错误:无法建立隧道套接字,因为= connect ETIMEDOUT
- 在使用Action Cable(Puma端口侦听)的同时将Ruby on Rails应用程序部署到Heroku
- 在Heroku上的Rails Friendly_Id,Heroku没有更新slug
- Heroku架构加载:数据库“postgres”用户的权限被拒绝
- Errno :: ECONNREFUSED(连接被拒绝 – 连接(2)为nil端口587):对于Heroku上的Rails
- Heroku推被拒绝–Hartl的Rails 3.2教程
- heroku – rails – 权限被拒绝(publickey)