2014-03-12 35 views
2

我們在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的虛擬內存的參數在性能指南Neo​​4j的描述,另一個內存映射工具: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的安裝在所有的相關性?

回答

1

簡短回答是「是」。選擇什麼樣的價值取決於你的寫作模式。 This給出了MongoDB究竟如何管理其映射的背景 - 這並不意外。

一個問題是,在一個面向網絡的數據庫應用程序中,您可能會考慮比吞吐量更多的延遲。 vm.dirty_background_ratio給出了開始寫入髒頁面的閾值,vm.dirty_ratio告訴在所有寫入已被刷新之前何時停止接受新寫入(即,塊)。

如果您正在研究一個相對較小的工作集,可以將這兩個值設置得相當高,並且依靠Mongo(或操作系統)週期性的基於時間的flush-to-disk來提交寫入。

如果你正在進行大量的插入操作和一些修改,這聽起來可能是你的情況,這是一個平衡的行爲,取決於插入與重寫 - 開始刷新太早會導致寫入儘快重寫,「浪費」io。在刷新大量寫入時,開始刷新太晚會導致暫停。

如果你正在做大部分插入操作,那麼你可能需要一個大的dirty_ratio(以避免阻塞)和一個相對較小的dirty_background_ratio(小到足以在插入時總是寫入以減少延遲,足以線性部分寫的)。

正確的解決方案是與重放這些sysctl的參數不同的選項一些虛擬的數據,並通過蠻力優化它,銘記你的平均延遲/總吞吐量的目標。

+0

這是真正有用的,因爲我們對延遲非常敏感。 –

相關問題