导致程序卡死,及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

}`

posted @ 2024-09-06 17:48  yongliu  阅读(9)  评论(0编辑  收藏  举报