导致程序卡死,及cpu无端占用的2个bug
1、程序初始化日志系统以后,单核cpu被吃满
原因 pprof 打印出来 全是系统调用,经分析是日志落盘时间设置成了0,导致一直在空写入
解决办法 增加写入间隔时间 不要时时刻刻落盘
2、程序突然hang死,无反应,使用pprof 记录全是 gorm,超过10万次出现,数据库方便,全是死连接,
原因
有代码忘了关闭事务,导致全是死连接,应用程序都在等待可用的数据库连接
解决办法
1、注意关闭事务
2、使用gorm 提供的方法 Transaction, 这个函数里面处理了panic error 和Rollback 及Commit
`
func (s *DB) Transaction(fc func(tx *DB) error) (err error) {
if _, ok := s.db.(*sql.Tx); ok {
return fc(s)
}
panicked := true
tx := s.Begin()
defer func() {
// Make sure to rollback when panic, Block error or Commit error
if panicked || err != nil {
tx.Rollback()
}
}()
err = fc(tx)
if err == nil {
err = tx.Commit().Error
}
panicked = false
return
}`