【问题标题】:Mongod resident memory usage lowMongod 常驻内存使用率低
【发布时间】:2013-10-04 03:05:54
【问题描述】:

我正在尝试调试 MongoDB 配置的一些性能问题,我注意到驻留内存使用率非常低(大约是系统内存的 25%),尽管偶尔会发生大量故障.鉴于 MongoDB 如此依赖内存,看到使用率如此之低,我感到很惊讶。

这是按内存使用情况排序的顶部快照。可以看出没有其他进程在使用大量内存:

top - 21:00:47 up 136 days,  2:45,  1 user,  load average: 1.35, 1.51, 0.83
Tasks:  62 total,   1 running,  61 sleeping,   0 stopped,   0 zombie
Cpu(s): 13.7%us,  5.2%sy,  0.0%ni, 77.3%id,  0.3%wa,  0.0%hi,  1.0%si,  2.4%st
Mem:   1692600k total,  1676900k used,    15700k free,    12092k buffers
Swap:   917500k total,    54088k used,   863412k free,  1473148k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2461 mongodb   20   0 29.5g 564m 492m S 22.6 34.2  40947:09 mongod
20306 ubuntu    20   0 24864 7412 1712 S  0.0  0.4   0:00.76 bash
20157 root      20   0 73352 3576 2772 S  0.0  0.2   0:00.01 sshd
  609 syslog    20   0  248m 3240  520 S  0.0  0.2  38:31.35 rsyslogd
20304 ubuntu    20   0 73352 1668  872 S  0.0  0.1   0:00.00 sshd
    1 root      20   0 24312 1448  708 S  0.0  0.1   0:08.71 init
20442 ubuntu    20   0 17308 1232  944 R  0.0  0.1   0:00.54 top

我想至少了解为什么内存没有被服务器更好地利用,最好是了解如何优化服务器配置或查询以提高性能。

更新: 内存使用率看起来很高是公平的,这可能会导致它是另一个进程的结论。服务器上没有其他进程使用任何显着内存;内存似乎在缓存中被消耗了,但我不清楚为什么会这样:

$free -m
             total       used       free     shared    buffers     cached
Mem:          1652       1602         50          0         14       1415
-/+ buffers/cache:        172       1480
Swap:          895         53        842

更新: 可以看到数据库还是缺页:

insert  query update delete getmore command flushes mapped  vsize    res faults       locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn   set repl       time
     0    402    377      0    1167     446       0  24.2g  51.4g     3g      0  <redacted>:9.7%          0       0|0     1|0   217k   420k   457 mover  PRI   03:58:43
    10    295    323      0     961     592       0  24.2g  51.4g  3.01g      0 <redacted>:10.9%          0      14|0     1|1   228k   500k   485 mover  PRI   03:58:44
    10    240    220      0     698     342       0  24.2g  51.4g  3.02g      5 <redacted>:10.4%          0       0|0     0|0   164k   429k   478 mover  PRI   03:58:45
    25    449    359      0     981     479       0  24.2g  51.4g  3.02g     32 <redacted>:20.2%          0       0|0     0|0   237k   503k   479 mover  PRI   03:58:46
    18    469    337      0     958     466       0  24.2g  51.4g     3g     29 <redacted>:20.1%          0       0|0     0|0   223k   500k   490 mover  PRI   03:58:47
     9    306    238      1     759     325       0  24.2g  51.4g  2.99g     18 <redacted>:10.8%          0       6|0     1|0   154k   321k   495 mover  PRI   03:58:48
     6    301    236      1     765     325       0  24.2g  51.4g  2.99g     20 <redacted>:11.0%          0       0|0     0|0   156k   344k   501 mover  PRI   03:58:49
    11    397    318      0     995     395       0  24.2g  51.4g  2.98g     21 <redacted>:13.4%          0       0|0     0|0   198k   424k   507 mover  PRI   03:58:50
    10    544    428      0    1237     532       0  24.2g  51.4g  2.99g     13 <redacted>:15.4%          0       0|0     0|0   262k   571k   513 mover  PRI   03:58:51
     5    291    264      0     878     335       0  24.2g  51.4g  2.98g     11  <redacted>:9.8%          0       0|0     0|0   163k   330k   513 mover  PRI   03:58:52

【问题讨论】:

  • 我猜其他进程正在耗尽内存。检查Mem: 1692600k total, 1665384k used, 27216k free
  • 没有其他进程在使用内存,但是缓存使用率很高。查看问题的更新。
  • 如果你在谈论交换缓存,那么 MongoDB 不使用交换 http://goo.gl/VwNdqp。据我所见,总使用的“内存”为 1665384k,其中 mongodb 仅使用了 23.3%。缓冲区(内存)大小也不是很高。必须有一些过程使 Mem (used) 变为 1665384k
  • @AbhishekKumar 我已更新顶部转储以显示服务器上的顶级内存使用者。既然您说 Mongo 没有使用内存,我将如何确定哪个进程是,看到 top 没有显示其他内存使用情况。
  • 缓冲区和缓存是一些东西,操作系统为其他进程缓存,以快速运行。因此,如果mongod 是该框中唯一运行的进程,则可以确定缓存文件大多是 MongoDB 数据文件。如果此 MongoDB 未投入生产,您可以使用此工具 https://github.com/10gen-labs/storage-viz 检查有关缓存在 RAM 中的页面的详细信息。休息已经发布了 1 个答案,您可以尝试 touchmongostat 命令。据我说,虽然 RA 不会影响内存利用的有效性,但会产生其他后果,而且大部分时间应该很低。

标签: mongodb memory


【解决方案1】:

这似乎是由于服务器上有大量非活动内存没有被清除以供 Mongo 使用。

通过查看以下结果:

cat /proc/meminfo

我可以看到大量的非活动内存。以 sudo 用户身份使用此命令:

free && sync && echo 3 > /proc/sys/vm/drop_caches && echo "" && free

释放了非活动内存,在接下来的 24 小时内,我可以看到 Mongo 实例的常驻内存在增加,以消耗服务器上剩余的可用内存。

感谢以下博客文章的说明:

http://tinylan.com/index.php/article/how-to-clear-inactive-memory-in-linux

【讨论】:

    【解决方案2】:

    MongoDB 只使用它需要的内存,所以如果 MongoDB 中的所有数据和索引都可以容纳在它当前使用的内存中,你将无法再推送它。

    如果数据集大于内存,有几个注意事项:

    • 通过运行 mongostat 并查看 resident-memory 来检查 MongoDB 本身以了解它认为自己使用了多少数据
    • 最近是否重新启动了 MongoDB?如果它很冷,那么数据将不会在内存中,直到它被分页(导致更多的页面错误最初逐渐解决)。查看touch 命令以获取有关“预热 MongoDB”的更多信息
    • 检查您的预读设置。如果您的系统预读太高,那么 MongoDB 将无法有效地使用系统上的内存。对于 MongoDB,一个好的数字是设置为 32(假设您有 512 个字节块,即 16 KB 的预读)

    【讨论】:

    • Mongostat 反映了这里看到的内容及其常驻内存值。服务器上的正常运行时间是 3834510,所以我相信它应该是稳定的。然而,预读设置设置为 256。我已将它们减少到 32,如果我看到任何变化,我会监控。
    【解决方案3】:

    我遇到了同样的问题:Windows Server 2008 R2、16 Gb RAM、Mongo 2.4.3。 Mongo 仅使用 2 Gb 的 RAM 并产生大量页面错误。查询非常慢。磁盘空闲,内存空闲。除了升级到 2.6.5,没有找到其他解决方案。它有帮助。

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 2011-03-15
      • 1970-01-01
      • 2019-01-23
      • 2011-05-30
      • 2019-12-10
      • 1970-01-01
      • 2023-03-09
      • 2021-03-24
      相关资源
      最近更新 更多