竟然遭遇psql OOM
1. 问题
今天logstash通过jdbc去postgres数据库查询数据的时候,数据库竟然Out of Memeory了,遇到这情况真有点不知道怎么解决。用来索引数据的sql查询确实很多都很慢,特别是那几个数据量大的,没有索引没有缓存,查询是相当的慢。可是我在这方面也没什么经验,这可怎么办才好。。
看了下历史日志,引发OOM的第一个查询平常耗时大概14s, 第二个查询大概27s,第一个OOM后,所有的查询都OOM了,早上数据库还直接挂掉了,应该是系统自动kill掉的。
2. 梳理
晚上7点开始在内网执行数据同步,从内部服务器同步到aws的rds, 同步完之后在半夜3点20分开始重新索引至es.
reindex平常基本都能正常跑,说明应该不是logstash进程导致的oom, 有可能是内存被别的进程吃掉了,最有可能的就是数据同步进程。
看了下数据同步的日志,确实是早上5、6点才执行完同步任务,怎么会这么慢呢。。?但是日志写的太简单了,没看见什么报错,找不到原因。
3. 定位问题
aws rds的cloudwatch最近一周可用内存的监控。可以看到可用内存一直很低。。但也没到底到0,那这OOM究竟是怎么发生的?

google了一下,看到下面这个blog,写了一些底层的内存分配体系,实际和共享内存之类,还说到长连接和work mem的设置有可能导致内存不足的问题,但是不太适用我们的情况。
下面这个讲了如何精准地查看一个进程在使用的内存
How much RAM is PostgreSQL using?
4. 解决问题
本来还想着是不是要改rds的配置, 比如提高内存分配,后来发现想多了,在aws上并不好改, 再说了我也不敢改啊: aws rds 可修改的参数
那就只能:
1.找到同步数据为什么那么慢的原因
2.有精力的话优化下logstash的config文件里的sql查询
为什么那么慢,又不是每天都这么慢,只能改一下同步脚本让把每天的日志都保存起来,然后再找规律了。

浙公网安备 33010602011771号