【问题标题】:Do I need to tune sysctl.conf under linux when running MongoDB?运行MongoDB时是否需要在linux下调整sysctl.conf?
【发布时间】: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 安装有任何关系?

【问题讨论】:

    标签: linux mongodb


    【解决方案1】:

    简短的回答是“是”。选择什么值很大程度上取决于您的写入模式。 This 提供了 MongoDB 如何管理其映射的背景 - 这并不意外。

    一个问题是,在面向 Web 的数据库应用程序中,您可能更关心延迟而不是吞吐量。 vm.dirty_background_ratio 给出开始写入脏页的阈值,而 vm.dirty_ratio 告诉何时停止接受新的写入(即阻塞),直到所有写入都被刷新。

    如果您正在敲击一个相对较小的工作集,您可以将这两个值都设置得相当高,并依靠 Mongo(或操作系统)的基于时间的定期刷新到磁盘来提交写入。

    如果您正在执行大量插入和一些修改,这听起来可能是您的情况,这是一个取决于插入与重写的平衡行为 - 过早开始刷新将导致写入很快重写,“浪费” io。太晚开始刷新将导致在刷新大量写入时暂停。

    如果您主要进行插入操作,那么您可能需要一个较大的dirty_ratio(以避免阻塞)和一个相对较小的dirty_background_ratio(足够小,以便在插入时始终写入以减少延迟,并且足够大线性化一些写入)。

    正确的解决方案是使用这些 sysctl 参数的各种选项重放一些虚拟数据,并通过蛮力对其进行优化,同时牢记您的平均延迟/总吞吐量目标。

    【讨论】:

    • 这真的很有帮助,因为我们对延迟非常敏感。
    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    相关资源
    最近更新 更多