我们在RDS PostgreSQL实例i上遇到内存问题。即postgresql服务器的内存使用率几乎达到100%,导致查询停滞,以及生产应用程序的停机时间。
RDS实例的内存使用量不会逐渐增加,但会在30分钟到2小时内突然显现
大多数情况下,我们发现很多来自机器人的流量正在发生,尽管在频率方面没有特定的模式。这可能发生在上一次出现的1周到1个月之后。
断开所有客户端,然后重新启动应用程序也无济于事,因为内存使用率再次快速上升。
运行“Full Vaccum”是我们发现的解决问题的唯一解决方案。
到目前为止我们尝试了什么
经常更新的一些表的定期吸尘(不是完全吸尘)。
停止在数据库中存储Web会话,因为它们非常不稳定并导致大量死元组。
这些都没有帮助。
我们考虑使用像pgcompact / pg_repack这样的工具,因为他们没有获得独占锁。但是这些不能与RDS一起使用。
我们现在看到很有可能这与内存膨胀有关,这可能发生在postgresql中,在rails 4中使用预准备语句,如下页所述:
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监控环境。
答案 0 :(得分:0)
定期真空应该有助于控制表膨胀但不会导致指数膨胀。
1)您是否尝试过更具侵略性的自动真空参数?
2)尝试过常规重建索引?如果锁定是一个问题,那么考虑
同时降低指数......
同时创建指数......