MongoDB:“[DataFileSync] 刷新 mmaps 需要 ... ms for ... 文件”是什么意思?

Mar*_*ace 5 mongodb memory

我正在 MongoDB 中为大型集合(~300GB)构建索引,db 终端窗口继续打印:

[DataFileSync] flushing mmaps took 10920ms for 151 files
Run Code Online (Sandbox Code Playgroud)

刷新 mmap 所需的时间通常约为 10 秒,有时甚至更长。我在高性能机器上运行 MongoDB,所以 RAM 可用性不是问题。

数据文件同步消息是什么意思?

有问题吗??

编辑:

刷新例程的真正问题是 MongoDB 在执行此操作时似乎冻结了。

即使是来自同一主机上的终端窗口的简单查询也必须等待刷新完成才能完成,而大约 10 秒(最多 150 秒)太长了。即使服务器上没有运行任何操作并且活动连接为零,例程也会发生(以 1、2 或 3 分钟的不规则间隔)。

我在 Windows Server 2008 R2 上运行 MongoDB 2.2.1 2008R2+。

Ada*_*m C 4

MongoDB 每 60 秒使用后台线程将内存中的数据更改刷新到磁盘(它是可调的,请参阅syncdelay)。在正常操作期间,这将是插入、更新、删除等(包括对索引的更改),并且将大致与您在这些操作方面的活动相关。mmaps 部分涉及 MongoDB 使用内存映射文件的事实

当您构建索引时,您将创建大量新的内存数据,并且这些数据每 60 秒都会保存到磁盘上。冲洗的速度取决于以下因素:

  • 有多少数据必须刷新到磁盘(在您的情况下已经进行了多少索引构建)
  • 您的磁盘能够以多快的速度写出该数据

鉴于您的示例显示刷新需要 10 秒,这意味着磁盘有点困难 - 个位数秒很高,两位数则令人担忧。当然,这确实取决于磁盘的性质 - 例如,如果 SSD 需要 10 秒,则需要大量数据。

这解释了消息传递,但除此之外,索引构建是密集(和阻塞)操作 - 您可以在主数据库的后台运行它们以避免一些影响,但它们将在辅助数据库的前台运行,直到 SERVER- 2771启动。固定的。因此,这里概述了使用副本集构建索引的推荐方法:

http://docs.mongodb.org/manual/administration/indexes/#index-building-replica-sets

影响将取决于构建需要多长时间、您当时正在做什么等。但如果您按照上面的说明进行操作,您应该能够避免任何影响最终用户的影响。