2015-04-04 159 views
3

的幾個問題已經問如何解決MongoDB的警告:爲什麼mongodb抱怨transparent_hugepage?

** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always.' 
**  We suggest setting it to 'never' 

但我不知道是否應該固定。我在谷歌雲上運行的Ubuntu VM上從MongoDB 3.0.1中得到這個警告。我應該相信MongoDB「永不」更好嗎?或者我應該相信谷歌/ Ubuntu,他們把它設置爲「總是」有一個很好的理由?我想有一些權衡需要考慮,不知道我會保留或修復它。

問問如何解決這個問題很好,但問是否修復它似乎更聰明。

+1

查看這個的方法是Google/Ubuntu將它設置爲'always',因爲這在一般情況下是很好的,而且MongoDB建議在特殊情況下'永遠'更好(特殊情況是運行MongoDB) – nos 2015-04-04 01:34:25

回答

17

編輯:自從我寫這個答案以來,Mongodb已經解決了這個問題。他們的建議是在https://docs.mongodb.com/master/tutorial/transparent-huge-pages/,可能應該是你的解決方案。我原來的答案仍然有效,但現在我認爲這是一個黑客,一個官方的解決方案是可用的。

原來的答覆:根據MongoDB的文檔,http://docs.mongodb.org/manual/reference/transparent-huge-pages/和支持,https://jira.mongodb.org/browse/DOCS-2131,transparent_hugepage(THP)被設計成與大量的內存中創建較少的大內存塊,而不是許多小的內存塊的系統。如果您的軟件需要大量連續的內存訪問,這非常棒。但是,對於MongoDB而言,無論內存是否可用,都需要大量較小的內存訪問,因此在禁用THP時性能更佳。

這讓我覺得無論哪種方式都可以工作,但是在THP關閉的情況下,您將獲得更好的mongo(或任何數據庫)性能,從而爲您提供更小的內存。如果你的記憶力不多,無論你跑什麼東西,THP可能都應該關閉。

在上面的鏈接中列出了幾種方法。最普遍適用的似乎是編輯rc.local。

$ sudo nano /etc/rc.local 

在「退出0」行之前插入以下行。

... 
if test -f /sys/kernel/mm/transparent_hugepage/khugepaged/defrag; then 
    echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag 
fi 
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then 
    echo never > /sys/kernel/mm/transparent_hugepage/defrag 
fi 
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then 
    echo never > /sys/kernel/mm/transparent_hugepage/enabled 
fi 
exit 0 

注:基於紅帽的系統可以使用「redhat_transparent_hugepage」而不是「transparent_hugepage」,可以通過進行檢查:

ls /sys/kernel/mm/*transparent_hugepage*/enabled 
cat /sys/kernel/mm/*transparent_hugepage*/enabled 

要應用更改,重新啓動(這將運行rc.local中)或:

$ sudo su 
# source /etc/rc.local 
# service mongod restart 
# exit 

正確應用上面

+0

謝謝!做完這些並重新啓動後,我仍然收到錯誤信息。我需要重新啓動mongod服務才能正常工作。 – JoeRocc 2016-05-08 09:12:28

+0

在Ubuntu 14.04上嘗試了很多東西,而這最終奏效了。謝謝! – 2016-06-04 16:32:04

+0

也在Ubuntu 16.04上工作。 – davisec52 2017-01-12 20:55:40

1

這些都不適用於運行Ubuntu 14.04的Amazon EC2實例,甚至不是由MongoDB推薦的init.d腳本。我不得不使用hugeadm工具,首先通過apt-get安裝,然後運行sudo hugeadm --thp-never,這個post指向我hugeadm。我仍然試圖找出如何禁用transparent_hugepage碎片整理。 hugeadm似乎沒有一個簡單的方法來做到這一點。

3

對於使用Ubuntu的暴發戶腳本:

由於我們與Ansible部署的機器我不喜歡修改RC文件或GRUB CONFIGS。

我嘗試使用sysfsutils/sysfs.conf,但在快速(或慢速機器)上啓動服務時遇到了計時問題。看起來有時候mongod是在sysfsutils之前啓動的。有時它起作用,有時它不起作用。

由於mongod的是一個暴發戶過程中我發現,最乾淨的解決方案是將文件添加/etc/init/mongod_vm_settings.conf包含以下內容:

# Ubuntu upstart file at /etc/init/mongod_vm_settings.conf 
# 
# This file will set the correct kernel VM settings for MongoDB 
# This file is maintained in Ansible 

start on (starting mongod) 
script 
    echo "never" > /sys/kernel/mm/transparent_hugepage/enabled 
    echo "never" > /sys/kernel/mm/transparent_hugepage/defrag 
end script 

這將運行的mongod會開始之前的腳本。 重新啓動mongod(sudo service mongod restart)並完成。

相關問題