带有Postgres的AWS RDS:是否已配置OOM杀手

时间:2018-09-03 11:16:19

标签: postgresql performance amazon-web-services amazon-rds

我们正在对访问Postgres数据库的应用程序进行负载测试。

在测试期间,我们突然得到了错误率的增加。 在分析了平台和应用程序行为之后,我们注意到:

  • Postgres RDS的CPU是100%
  • 可释放内存在同一台服务器上

在postgres日志中,我们看到:

  

2018-08-21 08:19:48 UTC :: @:[XXXXX]:LOG:服务器进程(PID XXXX)被信号9终止:终止

在研究并阅读了文档之后,似乎有一种可能是linux oomkiller运行终止了进程。

但是由于我们使用的是RDS,因此无法访问系统日志/ var / log消息进行确认。

某人也可以:

  • 确认oom killer确实在Postgres的AWS RDS上运行
  • 给我们一种检查方法吗?
  • 给我们一种基于连接数计算Postgres使用的最大内存的方法吗?

我在这里找不到答案

2 个答案:

答案 0 :(得分:4)

AWS维护一个页面,其中包含有关其RDS服务的最佳实践:https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_BestPractices.html

关于内存分配,这是建议:

  

Amazon RDS性能最佳实践是分配足够的RAM,以便   您的工作集几乎完全驻留在内存中。告诉是否   您的工作集几乎全部在内存中,请检查ReadIOPS指标   数据库实例加载时(使用Amazon CloudWatch)。的   ReadIOPS的值应小而稳定。如果扩大数据库   实例类(到具有更多RAM的类)会导致   ReadIOPS,您的工作集几乎没有完全存储在内存中。   继续扩大规模,直到ReadIOPS在此之后不再急剧下降   缩放操作或ReadIOPS减少到很小的数量。   有关监视数据库实例的指标的信息,请参见Viewing DB Instance Metrics

此外,这是他们对可能的操作系统问题进行故障排除的建议:

  

Amazon RDS为操作系统(OS)实时提供指标   数据库实例在其上运行。您可以查看数据库的指标   控制台使用实例,或使用增强型监控JSON   Amazon CloudWatch Logs的输出在您的监视系统中   选择。有关增强监控的更多信息,请参见Enhanced Monitoring

那里有很多很好的建议,包括查询调整。

请注意,作为最后的选择,您可以切换到与PostgreSQL兼容的Aurora

  

Aurora具有分布式,容错,自我修复的存储   系统,每个数据库实例可自动扩展到64TB。极光   通过多达15种低延迟提供高性能和可用性   读取副本,时间点恢复,连续备份到Amazon S3,   并跨三个可用区进行复制。

编辑:专门讨论与PostgreSQL有关的问题,请选中此Stack Exchange thread-他们之间的联系很长,并且自动提交设置为false。

  

我们之间的联系很长,自动提交设置为false:

     

connection.setAutoCommit(false)

     

在那段时间,我们做了很多事情   小查询和一些带有游标的查询:

     

statement.setFetchSize(SOME_FETCH_SIZE)

     

在JDBC中创建一个连接对象,然后从该连接中创建一个   创建语句。执行陈述时,您会得到结果   设置。

     

现在,这些对象中的每个对象都需要关闭,但是如果关闭   语句,该条目集已关闭,并且如果您关闭了连接   所有语句均已关闭,其结果集也是如此。

     

我们习惯于通过自己的联系来短暂查询   我们从不关闭假定连接将处理以下内容的语句   一切一旦关闭。

     

现在问题出在如此长的交易(〜24小时)内,   关闭连接。声明从未关闭。显然,   语句对象在运行   代码和PostgreSQL数据库上。

     

我对数据库中剩余的资源的最佳猜测是   与光标有关。使用游标的语句永远不会   关闭,因此返回的结果集也从未关闭过。这个   表示数据库没有释放数据库中的相关游标资源   DB,由于它在一个巨大的表上,因此占用了大量RAM。

希望有帮助!

答案 1 :(得分:0)

TLDR:如果您需要在AWS上使用PostgreSQL并且需要坚如磐石的稳定性,请在EC2上运行PostgreSQL(现在),并进行一些内核调整以防止过量使用


我会尽量简明扼要,但是您不是唯一一个看到这一点的人,这是RDS和Aurora PostgreSQL的一个已知问题(在Amazon内部)。

RDS / Aurora上的OOM杀手

OOM杀手确实可以在RDS和Aurora实例上运行,因为它们由Linux VM支持,并且OOM是内核的组成部分。

根本原因

根本原因是默认Linux内核配置假定您具有虚拟内存(交换文件或分区),但是EC2实例(以及支持RDS和Aurora的VM)默认没有虚拟内存。只有一个分区,没有定义交换文件。当linux认为它具有虚拟内存时,它使用一种称为“过量使用”的策略,这意味着它允许进程请求并被授予比系统实际拥有的ram更大的内存。有两个可调参数控制此行为:

vm.overcommit_memory -控制内核是否允许过量使用(0 =是=默认) vm.overcommit_ratio -内核可以过量使用的系统+交换百分比。如果您有8GB的内存和8GB的交换空间,并且您的vm.overcommit_ratio = 75,则内核将为进程分配最多12GB的内存。

我们设置了一个EC2实例(可以在其中调整这些参数),以下设置完全阻止了PostgreSQL后端被杀死:

vm.overcommit_memory = 2
vm.overcommit_ratio = 75

vm.overcommit_memory = 2告诉linux不要过度分配(在系统内存的限制内工作),vm.overcommit_ratio = 75告诉linux不要授予超过75%的内存请求(仅允许用户进程启动)。 75%的内存)。

我们对AWS持开放态度,他们致力于提供长期解决方案(使用内核调整参数或cgroup等),但我们尚无ETA。如果您遇到此问题,我建议您打开AWS案例并参考案例#5881116231,以便他们知道您也受到此问题的影响。

简而言之,如果您近期需要稳定性,请在EC2上使用PostgreSQL。如果必须使用RDS或Aurora PostgreSQL,则需要扩大实例的大小(这需要您额外付费),并希望获得最佳效果,因为过大的设置并不能保证您仍然不会遇到问题。