【发布时间】:2014-03-12 15:21:01
【问题描述】:
我们在 MongoDB 日志中看到偶尔对磁盘进行大量写入,从而有效地锁定 MongoDB 很长时间。网上很多人都反映了类似的问题,但我至今没有找到好的答案。
Tue Mar 11 09:42:49.818 [DataFileSync] flushing mmaps took 75264ms for 46 files
根据 mongo 统计数据,我服务器上的平均 mmap 刷新时间约为 100 毫秒。
我们的大部分 MongDB 数据会在几个小时内更新。这让我推测我们是否需要调整 Linux sysctl 虚拟内存参数,如另一个内存映射工具 Neo4J 的性能指南中所述:http://docs.neo4j.org/chunked/stable/linux-performance-guide.html
有很多块输出到 IO,对于我们的写入速度来说远远超过预期 在基准中看到。另一个可以观察到的是 Linux 内核 产生了一个名为“flush-x:x”(运行顶部)的进程,它似乎消耗了很多 资源。
这里的问题是Linux内核试图变得聪明并写出脏页 从虚拟内存。由于基准测试将内存映射 1GB 文件并进行随机写入 这很可能会导致系统上可用内存页的 1/4 被标记为脏。 Neo4j 内核不会向 Linux 内核发送任何系统调用以 将这些页面写入磁盘,但是 Linux 内核决定开始这样做 是一个非常糟糕的决定。结果是,而不是像写下那样做顺序 到磁盘(逻辑日志文件),我们现在正在随机写入 内存映射文件到磁盘。
TOP 表明我们确实有一个运行了很长时间的刷新进程,所以这似乎匹配。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28352 mongod 20 0 153g 3.2g 3.1g S 3.3 42.3 299:18.36 mongod
3678 root 20 0 0 0 0 S 0.3 0.0 26:27.88 flush-253:1
推荐的 Neo4J sysctl 设置是
vm.dirty_background_ratio = 50
vm.dirty_ratio = 80
这些设置是否与 MongoDB 安装有任何关系?
【问题讨论】: