我们正在对访问Postgres数据库的应用程序进行负载测试。
在测试期间,我们突然得到了错误率的增加。 在分析了平台和应用程序行为之后,我们注意到:
在postgres日志中,我们看到:
2018-08-21 08:19:48 UTC :: @:[XXXXX]:LOG:服务器进程(PID XXXX)被信号9终止:终止
在研究并阅读了文档之后,似乎有一种可能是linux oomkiller运行终止了进程。
但是由于我们使用的是RDS,因此无法访问系统日志/ var / log消息进行确认。
某人也可以:
我在这里找不到答案
答案 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,则需要扩大实例的大小(这需要您额外付费),并希望获得最佳效果,因为过大的设置并不能保证您仍然不会遇到问题。