Ich verwende MongoDB 3.0 und finde eine Warnung:
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
Ich versuche, Echo zu verwenden, aber es ist nicht dauerhaft, nach dem Neustart wird es zurückgesetzt.
echo never > /sys/kernel/mm/transparent_hugepage/defrag
Wie nehme ich /sys/kernel/mm/transparent_hugepage/enabled
dauerhafte Änderungen vor?
Antwort1
Du kannst
Installieren Sie das
sysfsutils
Paket:sudo apt install sysfsutils
und fügen Sie eine Zeile mit dieser Einstellung an
/etc/sysfs.conf
:kernel/mm/transparent_hugepage/enabled = never
Dies ist die sauberste Lösung, da die gesamte Sysfs-Konfiguration an einem Ort gespeichert wird, anstatt sich auf benutzerdefinierte Startskripte zu verlassen. Die anderen Antworten mit den Skripten und bedingten Ausdrücken sind geeignet, wenn Sie nicht wissen, über welchen Pfad der Kernel diese Einstellung verfügbar macht, d. h. wenn Sie nicht einmal eine ungefähre Vorstellung von der Kernelversion haben, die auf dem betroffenen Computer ausgeführt wird.
Antwort2
Die MongoDB-Dokumente enthalten einige Vorschläge.http://docs.mongodb.org/manual/reference/transparent-huge-pages/
Die „bevorzugte“ Methode besteht darin, die GRUB-Konfiguration zu bearbeiten /etc/default/grub
, anzuhängen und transparent_hugepage=never
dann neu GRUB_CMDLINE_LINUX_DEFAULT
zu update-grub
erstellen.
Genau das macht der folgende Zweizeiler. Überprüfen Sie unbedingt die Ausgabe!
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
Beachten Sie, dass dies update-grub
ein Wrapper für ist grub-mkconfig
. grub-mkconfig
überschreibt Einträge in /etc/default/grub
mit denen aus /etc/default/grub.d/*
. Wenn Sie zufällig AWS verwenden, müssen Sie stattdessen bearbeiten /etc/default/grub.d/50-cloudimg-settings.cfg
.
Die „alternative“ Methode besteht darin, /etc/rc.local
vorher Folgendes zu bearbeiten und hinzuzufügen 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
Persönlich habe ich letztendlich sowohl die „bevorzugte“ als auch die „alternative“ Methode ausprobiert, da sie sich nicht gegenseitig ausschließen und die Warnung bezüglich der Defragmentierung vermieden wird.
* Hat bei mir unter Ubuntu 14.04, MongoDB 3.0.2 und AWS funktioniert.
Antwort3
Hier ist eine Lösung, die getestet wurde und auf Ubuntu 16.04 auf AWS EC2 funktioniert. Ubuntu 16.04 verwendet das systemd-Init-System und diese Konfigurationsdatei gibt an, dass diese Einstellungen geändert werden sollten, bevor MongoDB hochfährt.
Erstellen Sie eine Datei mit dem Namen /etc/systemd/system/mongodb-hugepage-fix.service
und fügen Sie den folgenden Inhalt hinzu:
[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
So laden Sie die Datei in systemd:
systemctl daemon-reload
So aktivieren Sie die Datei als Boot-Time-Abhängigkeit von MongoDB
systemctl enable mongodb-hugepage-fix
Wenn Sie die Änderungen sofort aktivieren möchten (vor dem nächsten Booten)
systemctl start mongodb-hugepage-fix
systemctl restart mongod
Diese Lösung istnichtgeeignet für Ubuntu 14.04, das die Upstart-Init-Lösung anstelle von systemd verwendet.
Antwort4
Da wir Maschinen mit Ansible bereitstellen, möchte ich RC-Dateien nicht ändern.
Ich habe versucht sysfsutils
, / zu verwenden sysfs.conf
, aber beim Starten der Dienste auf schnellen (oder langsamen) Maschinen traten Zeitprobleme auf. Es sah so aus, als ob mongod manchmal vor sysfsutils gestartet wurde. Manchmal funktionierte es, manchmal nicht.
Da Mongod ein Emporkömmlingsprozess ist, habe ich festgestellt, dass die sauberste Lösung darin besteht, die Datei /etc/mongo_vm_settings.conf
mit dem folgenden Inhalt hinzuzufügen:
# 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
Dadurch wird das Skript ausgeführt, unmittelbar bevor mongod gestartet wird. Starten Sie mongod ( sudo service mongod restart
) neu und fertig.