【发布时间】: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 个答案,您可以尝试touch和mongostat命令。据我说,虽然 RA 不会影响内存利用的有效性,但会产生其他后果,而且大部分时间应该很低。