如何修改“/sys/kernel/mm/transparent_hugepage/enabled”

如何修改“/sys/kernel/mm/transparent_hugepage/enabled”

我使用 mongodb 3.0 並發現一個警告:

MongoDB shell version: 3.0.0
connecting to: test
Server has startup warnings: 
2015-03-13T16:28:29.405+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten]

~# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

~# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

我嘗試使用 echo,但它不是永久性的,重新啟動後它將被重置。

echo never > /sys/kernel/mm/transparent_hugepage/defrag

如何/sys/kernel/mm/transparent_hugepage/enabled永久修改?

答案1

你可以

  1. 安裝sysfsutils包:

    sudo apt install sysfsutils
    
  2. 並將包含該設定的行附加到/etc/sysfs.conf

    kernel/mm/transparent_hugepage/enabled = never
    

這是最乾淨的解決方案,因為它將所有 sysfs 配置保留在一個地方,而不是依賴自訂啟動腳本。如果您不知道內核將通過哪條路徑公開該設置,即如果您甚至不了解受影響計算機上運行的內核版本,則使用腳本和條件表達式的其他答案是合適的。

答案2

MongoDB 文件有一些建議。http://docs.mongodb.org/manual/reference/transparent-huge-pages/

「首選」方法是編輯/etc/default/grub並附加transparent_hugepage=never然後GRUB_CMDLINE_LINUX_DEFAULT運行update-grub以重建 GRUB 配置。

下面的兩行程式碼就可以做到這一點。確保驗證輸出!

sed -r 's/GRUB_CMDLINE_LINUX_DEFAULT="[a-zA-Z0-9_= ]*/& transparent_hugepage=never/' /etc/default/grub | sudo tee /etc/default/grub
sudo update-grub

請注意,這update-grub是 的包裝器grub-mkconfiggrub-mkconfig將破壞/etc/default/grub來自 的條目/etc/default/grub.d/*。如果您碰巧在 AWS 上運行,則需要改為編輯/etc/default/grub.d/50-cloudimg-settings.cfg.

「替代」方法是在/etc/rc.local之前編輯並添加以下內容exit 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

就我個人而言,我最終選擇了「首選」和「備用」方法,因為它們並不相互排斥,並且消除了有關碎片整理的警告。

* 在 Ubuntu 14.04、MongoDB 3.0.2 和 AWS 上為我工作。

答案3

這是一個經過測試可在 AWS EC2 上的 Ubuntu 16.04 上運行的解決方案。 Ubuntu 16.04 使用 systemd init 系統,該設定檔表示應在 MongoDB 啟動之前變更這些設定。

建立一個名為的檔案/etc/systemd/system/mongodb-hugepage-fix.service並新增以下內容:

[Unit]
Description="Disable Transparent Hugepage before MongoDB boots"
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
Before=mongodb.service      

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

[Install]
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
RequiredBy=mongodb.service

要將檔案載入到 systemd 中:

systemctl daemon-reload

啟動該檔案作為 MongoDB 的啟動時依賴項

systemctl enable mongodb-hugepage-fix

如果您想立即啟動變更(在下次啟動之前)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

這個解決方案是不是適用於 Ubuntu 14.04,它使用 Upstart init 解決方案而不是 systemd。

答案4

由於我們使用 Ansible 部署機器,我不喜歡修改 rc 檔案。

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

由於 mongod 是一個新貴進程,我發現最乾淨的解決方案是新增/etc/mongo_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) 即可完成。

相關內容