我們在MongoDB日誌中看到了對磁盤的巨大寫入,有效地鎖定了MongoDB很長一段時間。許多人都在網上報告類似的問題,但迄今爲止我沒有找到任何好的答案。運行MongoDB時,我需要在Linux下調整sysctl.conf嗎?
Tue Mar 11 09:42:49.818 [DataFileSync] flushing mmaps took 75264ms for 46 files
根據mongo統計數據,我服務器上的平均mmap刷新大約爲100 ms。
很大一部分MongDB數據會在幾個小時內更新。這使我猜測我們是否需要調整Linux的sysctl的虛擬內存的參數在性能指南Neo4j的描述,另一個內存映射工具:http://docs.neo4j.org/chunked/stable/linux-performance-guide.html
有很多塊走出去IO,方式更比預期的寫入速度我們 看到在基準。另一個可以觀察到的情況是,Linux內核 已經產生了一個名爲「flush-x:x」(run top)的進程,這個進程似乎正在消耗大量的 資源。
這裏的問題在於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的安裝在所有的相關性?
這是真正有用的,因爲我們對延遲非常敏感。 –