分析一个超级慢的psql插入
欢迎转载,请支持原创,保留原文链接:blog.ilibrary.me
		
		项目组做一个日志分析的工具,每天会导入大概3万条日志,插入到psql. 导入后再做分析,分给对应的人。
日志导入这一块一直是个头疼的事情。先描述基本数据:
- 每次导入的日志总量大概在3w条. json文件大小在1-2G。
    
- 2G日志压缩后16M上传到百度网盘了,链接: https://pan.baidu.com/s/12vO-aGGYfEGySDCe20V-oA 密码: ok7s
 
 - 每次导入时内存占用在十多个G。用的MacBook Pro, 32G内存.
 - 导入时通过批量插入的方式完成, 一次插入1000条记录, 总共3万条记录.
 - 有一张日志表,用来关联日志和分析结果的,一对一的关系,3万条记录。
 - 为了后续分析方便,每条日志都会把原始数据original_json保存到一个字段,jsonb格式,大小大概在50k-70k左右, 小的有11k的, 大的有到280K的. 这个字段早期就创建了。
 - 为了后续分析方便,每条日志都会把stacktrace保存到一个字段,jsonb格式,大小大概在50k左右, 大的有到120K的.
 - 导入完成后会做分析,产生分析结果。分析结果主要是需要上报的bug。bug数量不多,总数最多也就几百吧。
 - 每次导入前会把以前的日志清除。但是保留分析结果。
 - 最开始导入的时候大概20多分钟可以搞定。
 - 导入几次以后就变成800多分钟才能搞定了。
 - 再后来变成1400多分钟,一整天。数据量没有变过。
 - 确定不是后端代码的问题。把插入语句注释掉以后所有流程跑完只需要几分钟.
 
前期分析:
- 内存应该是够的。不排除内存交换到磁盘太多导致的速度问题。
 - CPU够。
 - 速度慢主要在批量插入那一块。
 - 所以下一步主要方向先分析psql性能日志.
 
postgres 日志分析
用pgbadger分析日志
- 安装pgbadger: 
brew install pgbadger - 分析日志: 
pgbadger '/Users/xxxx/Library/Application Support/Postgres/var-12/postgresql.log' - 获取分析报告: 
open ./out.html- parsed events: 2878958
 - 啥也没有看出来。
 
 
现在不知道怎么搞了。
试试进psql进行单条插入和count查询,看看速度。
解决方法
把batch insert 1000 改成10条每batch, 时间瞬间降下来了,同样的数据71分钟导入完成.
具体原因未知。留一个历史疑案吧。
更新2:
71分钟还是慢了一点,后来做成增量式插入了。增量一次大概几分钟可以搞定.

