mgo 默认连接池过大(4096)导致并发请求下连接数持续增长、无法及时释放,最终触发系统文件描述符上限;正确做法是显式限制 `maxpoolsize` 并规范 session 生命周期管理。
在 Go 应用中使用 mgo 连接 MongoDB 时,一个常见但隐蔽的问题是:看似正确调用 session.Close(),连接却未及时回收,最终耗尽系统文件描述符(如 ulimit -n 限制的 1024)。你观察到 lsof 显示大量 ESTABLISHED 状态的 TCP 连接指向 localhost:27017,正是这一问题的典型表现。
根本原因在于:mgo.Dial() 默认创建的连接池(MaxPoolSize)为 4096,远超实际并发需求。即使每个请求后调用 session.Copy().Close(),mgo 仍会为后续请求复用并长期保活空闲连接——尤其在低频高并发或长连接场景下,连接不会主动断开,而是滞留在池中等待复用,最终累积至系统级资源瓶颈。
✅ 正确解决方案是 显式配置连接池大小 + 严格遵循 session 使用范式: