背景
golang写的后台服务,每到凌晨时段,就开始疯狂的重启;
问题定位
- 查看/var/log/message 发现oom kill,开始往内存泄漏方面考虑;
- 加入pprof工具分析,发现goroutine大量增长,考虑由于goroutine泄漏导致内存占用过大被Kill
问题数据
64484 runtime.gopark
runtime.selectgo
database/sql.(*DB).conn
database/sql.(*Stmt).connStmt
database/sql.(*Stmt).ExecContext
database/sql.(*Stmt).Exec (inline)
上述的*Stmt
是通过db.Prepare
生成的
查资料
sql.Stmt
由Prepare
生成的,在执行语句的使用,先去找空连接,如果存在就使用,如果出现忙,那就进行reprepare
进行新建连接,正因为这个机制,导致在高并发的场景下,会出现新建大量携程的问题;
修改
未完待续