【问题标题】:why my mongodb fileSize is much bigger than storageSize in db.stats()?为什么我的 mongodb fileSize 比 db.stats() 中的 storageSize 大得多?
【发布时间】:2013-12-12 01:34:19
【问题描述】:

我有一个名为 log_test1 的数据库,只有 1 个上限收集日志。上限集合的最大大小为 512M。插入200k数据后,发现db的磁盘使用量为1.6G。使用 db.stats(),我可以看到 storageSize 是 512M,正确,但我的实际 fileSize 是 1.6G,为什么会这样?如何控制磁盘大小只是我的上限集合大小加上索引大小?

> use log_test1
switched to db log_test1
> db.stats()
{
    "db" : "log_test1",
    "collections" : 3,
    "objects" : 200018,
    "avgObjSize" : 615.8577328040476,
    "dataSize" : 123182632,
    "storageSize" : 512008192,
    "numExtents" : 3,
    "indexes" : 8,
    "indexSize" : 71907920,
    "fileSize" : 1610612736,
    "nsSizeMB" : 16,
    "dataFileVersion" : {
        "major" : 4,
        "minor" : 5
    },
    "ok" : 1
}

【问题讨论】:

    标签: mongodb diskspace


    【解决方案1】:

    这可能是因为 MongoDB 预先分配了数据和日志文件。


    MongoDB 2

    在数据目录中,MongoDB 将数据文件预分配到特定大小,部分是为了防止文件系统碎片。 MongoDB 将第一个数据文件命名为<databasename>.0,下一个为<databasename>.1,以此类推。mongod 分配的第一个文件是 64 兆字节,接下来是 128 兆字节,以此类推,最多 2 GB,其中点所有后续文件都是 2 GB。数据文件包括已分配空间但不包含数据的文件。 mongod 可能会分配一个 1 GB 的数据文件,该文件可能 90% 为空。对于大多数大型数据库,未使用的分配空间与数据库相比很小。

    在类 Unix 系统上,mongod 预分配一个额外的数据文件并将磁盘空间初始化为 0。在后台预分配数据文件可防止下次分配新数据库文件时出现明显延迟。

    您可以使用 noprealloc 运行时选项禁用预分配。但是,noprealloc 旨在用于生产环境:仅将 noprealloc 用于测试和经常删除数据库的小型数据集。 p>

    MongoDB 3

    数据目录中的数据文件,即/data/db 默认配置中的目录,可能大于数据集 插入到数据库中。考虑以下可能的原因:

    预分配的数据文件

    MongoDB 预先分配其数据文件以避免文件系统碎片, 正因为如此,这些文件的大小不一定 反映数据的大小。

    storage.mmapv1.smallFiles 选项将减小这些文件的大小 文件,如果磁盘上有许多小型数据库,这可能会很有用。

    操作日志

    如果这个 mongod 是副本集的成员,则数据 目录包括oplog.rs 文件,这是一个预先分配的上限 在本地数据库中收集。

    默认分配约为 64 位磁盘空间的 5% 安装。

    杂志

    数据目录包含日志文件,其中存储 在 MongoDB 将它们应用到数据库之前在磁盘上写入操作。

    空记录

    MongoDB 维护数据文件中的空记录列表 因为它会删除文档和集合。 MongoDB可以重用这个空间, 但默认情况下不会将此空间返回给操作系统。


    取自MongoDB Storage FAQ

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-29
      • 2011-02-24
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2020-11-17
      相关资源
      最近更新 更多