高峰期接口大量报 MongoWaitQueueTimeoutError,日志里提示从连接池取连接超时,等几秒再试又能通过。日志里能对上时间点,这种反而好排。
maxPoolSize 只有 10,慢查询把连接长期占住,等待队列一满新请求直接超时,单纯加机器只会让排队更严重。这一点先确认清楚,后面就不用反复试。
mongodb://host:27017/app?maxPoolSize=100&maxTimeMS=2000
db.currentOp({ secs_running: { $gt: 1 } })
「MongoDB 连接池耗尽」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
处理上按这个顺序:先看当前操作列表里有没有跑超过一秒的慢查询;把 maxPoolSize 调到与并发量匹配,不要照抄默认值;给单次查询加 maxTimeMS 兜底,防止连接被占死。
结果对不对很好判断,压测下不再出现取连接超时,连接池占用稳定在六成以下。
