MongoDB连续执行find查询后WiredTiger报磁盘不足崩溃,df查询仍显示15G空闲
WiredTiger 报 No space left on device 但磁盘剩余空间充足的排查方案
WiredTiger 返回错误码 28(ENOSPC)时,df -h 显示磁盘剩余空间充足的场景,可按以下顺序逐项排查根因:
- inode 资源耗尽
- 块容量剩余不代表可写,当文件系统的 inode 数量被占满时,哪怕剩余几十G空间,所有新建文件、写入临时文件的操作都会返回 ENOSPC 错误。
- 排查命令:
df -i,重点核对 MongoDBdbpath所在分区的 IUse% 指标,若达到 100% 即可确认根因。 - 场景匹配:连续执行无索引覆盖的 find 查询时,WiredTiger 会在数据目录生成大量临时排序小文件,短时间内即可耗尽分区 inode。
- 磁盘配额限制
- 若主机对 mongodb 用户、或
/var/lib/mongodb目录开启了用户/组级磁盘配额,哪怕整个分区剩余空间充足,达到配额上限后仍会报 ENOSPC 错误。 - 排查命令:
- 查看 mongodb 用户的配额限制:
quota -u mongodb - 检查分区挂载参数:
mount | grep quota,确认挂载是否开启了 usrquota/grpquota 规则。
- 查看 mongodb 用户的配额限制:
- 若主机对 mongodb 用户、或
- dbpath 挂载点识别错误
- 若 MongoDB 配置的
dbpath子目录是单独挂载的小容量分区(如 tmpfs、独立小磁盘),df -h默认展示的根分区剩余空间没有参考意义,实际 dbpath 所在分区可能已经写满。 - 排查命令:
df -h /var/lib/mongodb,单独核对数据目录所在挂载点的真实容量使用率。
- 若 MongoDB 配置的
- 网络文件系统(NFS)元数据缓存偏差
- 若 dbpath 挂载在 NFS 存储上,NFS 服务端的物理块已经写满,但客户端的块使用缓存未同步更新,会出现客户端
df -h显示剩余空间充足,实际写入时收到服务端返回的 ENOSPC 错误。 - 排查方法:在 NFS 服务端对应存储目录执行
df -h核对真实容量,在客户端执行echo 3 > /proc/sys/vm/drop_caches刷新缓存后重新查看剩余空间是否匹配。
- 若 dbpath 挂载在 NFS 存储上,NFS 服务端的物理块已经写满,但客户端的块使用缓存未同步更新,会出现客户端
- 已删除文件的句柄占用导致的空间偏差
- 若 MongoDB 运行期间关联的被删除文件句柄跨挂载点持有,会出现客户端块统计偏差:块设备实际剩余空间已经耗尽,但
df读取的元数据未更新。 - 排查命令:
lsof -p [mongodb进程ID] | grep deleted,筛选 mongodb 进程关联的已删除未释放文件,累计计算占用空间,若与实际剩余空间偏差较大即可确认根因。
- 若 MongoDB 运行期间关联的被删除文件句柄跨挂载点持有,会出现客户端块统计偏差:块设备实际剩余空间已经耗尽,但
注:日志中报错的
WiredTiger.turtle.set是 checkpoint 阶段生成的临时元数据文件,单文件大小仅 1KB 左右,只要触发上述任意一种写入限制,哪怕写入几百字节都会触发报错,与日志中“写入1091字节失败”的表现完全匹配。
内容的提问来源于stack exchange,提问作者balu
相关产品推荐
相关产品推荐

