
默认的最大连接数是 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 2024-04-02 12:07:38 +08:00 感觉是你用完了连接没有放回池子。 一般 wait_timeout 要看 连接池有没有 keepalived 的机制,没有的话就会用 linux 自己的 tcp 连接 keepalived 参数。wait_timeout 要确保至少大于长链接心跳间隔。 |
2 yuyang1992test OP @idontnowhat2say 我没看到 gorm 需要手动放回池子的操作,我设置 wait_timeou=600 秒看起来是解决了,现在 show processlist 不会有 sleep 超过 600 秒的了 |
3 lifeHasOnce 2024-04-02 15:51:41 +08:00 1.是不是有重复创建链接的场景 2.是不是事务没有 commit 3.你可以 show processlist 查看 ip 看看来源是那个机器,在定位一下具体哪一行代码 |
4 4357 2024-04-02 16:10:23 +08:00 gorm 有连接池,且不需要手动释放。同一个连接给多次查询复用 默认的 8 小时是连接释放的时间 |
5 XuHuan1025 2024-04-02 17:45:03 +08:00 因为你用了 jetbrain |