2013-10-04 87 views
6

我試圖調試一些MongoDB配置的性能問題,並且我注意到常駐內存使用情況非常低(大約佔系統內存的25%),儘管偶爾會出現這種情況大量的故障發生。考慮到MongoDB依賴內存,我很驚訝地發現它的使用率很低。Mongod常駐內存使用率低

下面是按內存使用排序的頂部快照。由此可以看出,沒有其他進程使用的內存顯著:

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 

UPDATE: 你可以看到,數據庫仍是頁面錯誤:

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 
+0

我想其他一些進程正在使用內存。檢查'Mem:總共1692600k,使用1665384k,使用27216k'' –

+0

沒有其他進程正在使用內存,但緩存使用率很高。查看問題的更新。 –

+0

如果您正在討論swap cache,那麼MongoDB不會使用swap'http:// goo.gl/VwNdqp'。根據我可以看到,總的使用'Mem'是1665384k,其中mongodb僅使用23.3%。緩衝區(Mem)的大小也不是很高。必須有一些進程使Mem(已用)1665384k –

回答

4

看來這是由服務器上的大量非活動內存造成了設置,沒有被清除Mongo的使用。

通過從觀察結果:

cat /proc/meminfo 

我可以看到大量的非活動內存。使用此命令爲sudo的用戶:

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

釋放了無效的內存,並且在未來24小時內,我能看到我的蒙戈實例的駐留內存越來越消耗內存上的可用休息服務器。

信貸以下博客文章爲它的指示:

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

0

MongoDB只使用盡可能多的內存,所以如果MongoDB中的所有數據和索引都可以放入當前正在使用的內部,那麼您將無法再使用它了。

如果數據集比內存大,有幾個方面的考慮:

  • 檢查MongoDB的本身,看它認爲有多少數據通過運行mongostat,看着常駐內存的使用
  • MongoDB最近是否重新啓動?如果它很冷,那麼數據將不會在內存中,直到它被調入(導致更多的初始頁錯誤逐漸解決)。查看touch命令以獲取有關「升溫MongoDB」的更多信息
  • 檢查您的預讀設置。如果您的系統預讀太高,那麼MongoDB無法有效地使用系統上的內存。 MongoDB的一個好數字下手爲32(這是16 KB的預讀假設你有512個字節塊)
+0

Mongostat反映了它駐留的內存值。服務器上的正常運行時間是3834510,所以我認爲它應該是穩定的。提前讀取設置*爲*,但是設置爲256.我已將它們減少到32,並且會監視是否看到任何更改。 –

0

我有同樣的問題:在Windows Server 2008 R2,16 GB內存,蒙戈2.4.3。 Mongo僅使用2 Gb的RAM併產生大量頁面錯誤。查詢非常緩慢。磁盤空閒,內存空閒。找不到升級到2.6.5的其他解決方案。它有幫助。