gridfs特别消耗ulimit,因其依赖mongod进程的文件描述符和线程资源:每个上传/下载请求需建立连接、读写多个chunk文档、维持复制/分片连接,高并发下极易触达系统限制。

MongoDB GridFS 本身不直接暴露文件描述符或线程数配置,但它高度依赖底层 mongod 进程的资源能力——尤其是高并发上传/下载小文件时,ulimit -n(文件描述符)和 ulimit -u(进程/线程数)不足会直接触发 too many open files 或连接拒绝,GridFS 操作卡在 socket 层就失败了。
为什么 GridFS 特别吃 ulimit
GridFS 不是独立服务,而是通过驱动将大文件切块存入 fs.chunks 集合、元数据存入 fs.files。每个上传/下载请求都会:
- 建立至少 1 个客户端连接(占用 2 个文件描述符 + 1 线程)
- 触发 mongod 内部对多个 chunk 文档的读写,可能并发打开 journal 文件、数据文件(每个文件 1 个 fd)
- 在副本集环境下,还要维持到其他节点的复制连接
- 如果用 mongos 路由(比如分片 GridFS),连接数呈指数级增长:每个分片副本集 N 个节点 × 每个节点 2 fd × 客户端并发数
默认 CentOS 7 的 ulimit -n 是 1024,GridFS 并发上传 50 个 1MB 文件就可能打满。
/etc/security/limits.conf 必须配 soft/hard nofile 和 nproc
只改 nofile 不够,mongod 启动后会 fork 多个后台线程(TTL 清理、journal 刷盘、复制心跳),这些都算作进程(nproc)。漏配 nproc 可能导致启动报 fork: retry: Resource temporarily unavailable。
- 编辑
/etc/security/limits.conf,为运行mongod的用户(如mongod或root)添加两行: mongod soft nofile 65535mongod hard nofile 65535mongod soft nproc 65535mongod hard nproc 65535- 注意:不能只写
*,systemd 服务默认忽略通配符,必须指定用户名 - 确认
/etc/pam.d/system-auth或/etc/pam.d/common-session包含session required pam_limits.so(CentOS 7 默认有)
systemd 服务文件里加 LimitNOFILE 才真正生效
CentOS 7 用 systemd 管理 mongod,它绕过 limits.conf 加载逻辑。即使 limits.conf 配了,systemctl start mongod 启动的进程仍走 systemd 默认限制(通常是 4096)。
- 编辑服务文件:
sudo vi /usr/lib/systemd/system/mongod.service(或/etc/systemd/system/mongod.service如果覆盖过) - 在
[Service]段下添加: LimitNOFILE=65535LimitNPROC=65535- 重载并重启:
sudo systemctl daemon-reload && sudo systemctl restart mongod - 验证是否生效:
cat /proc/$(pgrep -f "mongod")/limits | grep "Max open files",输出应为65535
别忘了 fs.file-max 内核级兜底
ulimit -n 是 per-process,fs.file-max 是全系统总上限。如果 GridFS 并发很高,且服务器还跑着其他服务(如 Nginx、监控 agent),总文件描述符可能超限,内核会静默拒绝新分配。
- 检查当前值:
cat /proc/sys/fs/file-max - 临时提高:
sudo sysctl -w fs.file-max=100000 - 永久生效:在
/etc/sysctl.conf添加fs.file-max = 100000,再执行sudo sysctl -p - 经验值:设为
ulimit -n值 × 运行中的关键进程数 × 1.5,例如 5 个服务 × 65535 ≈ 100000 足够
GridFS 的瓶颈从来不在 MongoDB 自身配置,而在操作系统对“连接”和“文件”的原始供给能力。改完 limits.conf 不 reload systemd、没设 fs.file-max、或者用 root 启动却给普通用户配 limits——这三类操作失误占实际部署问题的 80% 以上。











