RDS PostgreSQL实例/ Rails 4上的内存问题

时间:2016-05-08 04:21:14

标签: ruby-on-rails-4 memory-leaks postgresql-9.3 amazon-rds rails-postgresql

我们在RDS PostgreSQL实例i上遇到内存问题。即postgresql服务器的内存使用率几乎达到100%,导致查询停滞,以及生产应用程序的停机时间。

  • RDS实例的内存使用量不会逐渐增加,但会在30分钟到2小时内突然显现

  • 大多数情况下,我们发现很多来自机器人的流量正在发生,尽管在频率方面没有特定的模式。这可能发生在上一次出现的1周到1个月之后。

  • 断开所有客户端,然后重新启动应用程序也无济于事,因为内存使用率再次快速上升。

  • 运行“Full Vaccum”是我们发现的解决问题的唯一解决方案。

到目前为止我们尝试了什么

  1. 经常更新的一些表的定期吸尘(不是完全吸尘)。

  2. 停止在数据库中存储Web会话,因为它们非常不稳定并导致大量死元组。

  3. 这些都没有帮助。

    1. 我们考虑使用像pgcompact / pg_repack这样的工具,因为他们没有获得独占锁。但是这些不能与RDS一起使用。

    2. 我们现在看到很有可能这与内存膨胀有关,这可能发生在postgresql中,在rails 4中使用预准备语句,如下页所述:

    3. Memory leaks on postgresql server after upgrade to Rails 4 https://github.com/rails/rails/issues/14645

      作为快速试用版,我们现在已经在rails数据库配置中禁用了预处理语句,并且正在观察系统。如果问题再次出现,这个假设将被证明是错误的。

      设置详情:

      我们在Amazon Elastic Beanstalk中运行我们的生产环境,具有以下配置:

      应用服务器

      OS:运行Ruby 2.1的64位Amazon Linux 2016.03 v2.1.0(Puma) 实例类型:r3.xlarge 根卷大小:100 GiB 应用服务器数量:2 在每台服务器上运行的Rails工作者:4 每个工作者的最大线程数:8 数据库池大小:50(适用于每个工作人员)

      数据库(RDS)详细信息:

      PostgreSQL版本:PostgreSQL 9.3.10 RDS实例类型:db.m4.2xlarge Rails版本:4.2.5 磁盘当前大小:2.2GB 表数:94

      使用AWS cloudwatch和NewRelic监控环境。

1 个答案:

答案 0 :(得分:0)

定期真空应该有助于控制表膨胀但不会导致指数膨胀。

1)您是否尝试过更具侵略性的自动真空参数?

2)尝试过常规重建索引?如果锁定是一个问题,那么考虑

同时降低指数......

同时创建指数......