默认的最大连接数是 151 ,改到了 1000 ,暂时解决。 我排查代码,用的 gorm,是有设置连接数的
db, err := gorm.Open("mysql", c.DSN)
if err != nil || db == nil {
panic(err)
}
db.DB().SetMaxIdleConns(c.MaxIdle)
db.DB().SetMaxOpenConns(c.MaxConn)
但是执行 select * from information_schema.PROCESSLIST 会看到很多 command 是 sleep 我排查代码应该是没有未提交的事务 我自己起终端测试,在提交了事务后还是会有 sleep, 只有吧客户端关了才可以 是和 mysql 的 wait_timout 有关系吗?我看这个默认 8 小时,一般线上这个值是多少?
1
idontnowhat2say 229 天前
感觉是你用完了连接没有放回池子。
一般 wait_timeout 要看 连接池有没有 keepalived 的机制,没有的话就会用 linux 自己的 tcp 连接 keepalived 参数。wait_timeout 要确保至少大于长链接心跳间隔。 |
2
yuyang1992test OP @idontnowhat2say 我没看到 gorm 需要手动放回池子的操作,我设置 wait_timeou=600 秒看起来是解决了,现在 show processlist 不会有 sleep 超过 600 秒的了
|
3
davionnini 229 天前
1.是不是有重复创建链接的场景
2.是不是事务没有 commit 3.你可以 show processlist 查看 ip 看看来源是那个机器,在定位一下具体哪一行代码 |
4
4357 229 天前
gorm 有连接池,且不需要手动释放。同一个连接给多次查询复用
默认的 8 小时是连接释放的时间 |
5
XuHuan1025 229 天前
因为你用了 jetbrain
|