Jak zmodyfikować „/ sys / kernel / mm / transparent_hugepage / enabled”

50

Używam mongodb 3.0 i widzę ostrzeżenie:

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

Próbuję użyć echa, ale nie jest to trwałe, po ponownym uruchomieniu zostanie zresetowane.

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

Jak mogę zmienić na /sys/kernel/mm/transparent_hugepage/enabledstałe?

Feng Yu
źródło
1
Poniżej mogą znajdować się dobre odpowiedzi, ale IMO powinno zajrzeć do oficjalnej dokumentacji MongoDB: docs.mongodb.org/master/tutorial/transparent-huge-pages
hgoebl

Odpowiedzi:

70

Możesz

  1. zainstaluj sysfsutilspakiet:

    sudo apt install sysfsutils
    
  2. i dodaj linię z tym ustawieniem, aby /etc/sysfs.conf:

    kernel/mm/transparent_hugepage/enabled = never
    

Jest to najczystsze rozwiązanie, ponieważ utrzymuje konfigurację sysfs w jednym miejscu zamiast polegać na niestandardowych skryptach startowych. Inne odpowiedzi, wraz ze skryptami i wyrażeniami warunkowymi, są odpowiednie, jeśli nie wiesz, przez którą ścieżkę jądro ujawni to ustawienie, tj. Jeśli nie masz pojęcia o wersji jądra działającej na zaatakowanym komputerze.

David Foerster
źródło
4
To nic mi nie zrobiło w Ubuntu 14.04 w instancji AWS EC2. Nie wiem dużo o sysfs.conf, ale wygląda na to, że jest to konfiguracja obsługiwana przez Ubuntu, ale plik nie istniał wcześniej w naszym systemie, a dodanie go i ponowne uruchomienie nie zmieniło ostrzeżeń o wyjściu mongo. Wypróbowałem też poniższą radę clayzermk1, wciąż pojawiało się ostrzeżenie „defrag”. Oficjalny skrypt inicjujący docs docs usunął oba ostrzeżenia.
Neek,
Jaka jest wydajność cat /sys/kernel/mm/transparent_hugepage/enabled? Czy to w ogóle istnieje? sysfs.confjest zwykle oceniany przy starcie przez /etc/init.d/sysutils. Czy to jest włączone? Co się dzieje, kiedy się wywołujesz /etc/init.d/sysutils start?
David Foerster,
3
Ja też nie mam sysfs.confpliku i /etc/init.d/sysutils. ubuntu 16.04
HEX
1
@unhammer: Nie, oba mają różne zakresy. sysctldotyczy ustawień, które można również osiągnąć za pomocą parametrów jądra; sysfs.confjest dla wpisów w /sys.
David Foerster,
1
@ anvossoc: Czy możesz otworzyć nowe pytanie, jeśli masz nowe pytanie lub pytanie? Sekcja komentarzy nie jest odpowiednia ani przeznaczona do nowych pytań lub rozszerzonej dyskusji. Możesz wysłać mi komentarz z powiadomieniem, aby zwrócić na to uwagę. Dzięki.
David Foerster,
25

Dokumenty MongoDB mają kilka sugestii. http://docs.mongodb.org/manual/reference/transparent-huge-pages/

W „preferowane” sposobem jest edycja /etc/default/grubi dołączyć transparent_hugepage=neverdo GRUB_CMDLINE_LINUX_DEFAULTuruchom update-grubodbudować konfigurację GRUB.

Następujący dwuwarstwowy tak właśnie zrobi. Upewnij się, aby zweryfikować dane wyjściowe!

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

Zauważ, że update-grubjest to opakowanie dla grub-mkconfig. grub-mkconfigzablokuje wpisy /etc/default/grubz tymi z /etc/default/grub.d/*. Jeśli przypadkowo korzystasz z AWS, musisz zamiast tego dokonać edycji /etc/default/grub.d/50-cloudimg-settings.cfg.

Metodą „alternatywną” jest wcześniejsza edycja /etc/rc.locali dodanie następujących elementów 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

Osobiście skończyłem, stosując metody „preferowane” i „alternatywne”, ponieważ nie wykluczają się one wzajemnie i eliminuje to ostrzeżenie o defragmentacji.

* Pracował dla mnie na Ubuntu 14.04, MongoDB 3.0.2 i AWS.

clayzermk1
źródło
Próbowałem tego na moim serwerze aplikacji MongoDB jednym kliknięciem na DigitalOcean i nie działało. Nadal pojawia się ten sam komunikat ostrzegawczy.
straszny
Dziękuję za część dotyczącą EC2 i50-cloudimg-settings.cfg
Martin Konecny
16

Oto rozwiązanie, które zostało przetestowane pod kątem działania na Ubuntu 16.04 na AWS EC2. Ubuntu 16.04 używa systemowego systemu inicjującego, a ten plik konfiguracyjny wyraża konieczność zmiany tych ustawień przed uruchomieniem MongoDB.

Utwórz plik o nazwie /etc/systemd/system/mongodb-hugepage-fix.servicei dodaj następującą treść:

[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

Aby załadować plik do systemd:

systemctl daemon-reload

Aby aktywować plik jako zależność MongoDB od czasu uruchomienia

systemctl enable mongodb-hugepage-fix

Jeśli chcesz aktywować zmiany natychmiast (przed następnym uruchomieniem)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

To rozwiązanie nie jest odpowiednie dla Ubuntu 14.04, który korzysta z rozwiązania inicjującego Upstart zamiast systemd.

Mark Stosberg
źródło
1
Poprawka systemowa jest idealna do nowoczesnych instalacji MongoDB, dziękuję.
four43
7

Dodaj poniższe wiersze do pliku /etc/rc.local.

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

Uruchomi się po ponownym uruchomieniu serwera.

PKumar
źródło
1
Czy jest na to plik konfiguracyjny? rc.localnie jest dobrym pomysłem, ponieważ rc.local wykona się pod koniec uruchamiania systemu. Tak więc usługa mongodb nadal będzie używać ustawienia domyślnego.
Feng Yu,
2
edytuj plik / etc / default / grub i wprowadź zmiany w wierszu „GRUB_CMDLINE_LINUX_DEFAULT =„ transparent_hugepage = never ”i uruchom polecenie update-grub, a następnie uruchom ponownie serwer
PKumar
2
Dzięki, działa. Ale czy istnieje podobny sposób modyfikacji /sys/kernel/mm/transparent_hugepage/defrag? Podczas ponownego uruchamiania powłoka mongo mówi mi również „** OSTRZEŻENIE: / sys / kernel / mm / transparent_hugepage / defrag is„ always ”.
Feng Yu,
@FengYu wypróbuj tę stronę docs.mongodb.org/manual/tutorial/transparent-huge-pages
PKumar
0

GRUB zmieni się po aktualizacji, a rc.local będzie działał tylko po uruchomieniu mongo, więc może powinniśmy dodać usługę restartu mongo na końcu rc.local w ten sposób

if test -f / sys / kernel / mm / transparent_hugepage / enabled; następnie
  echo nigdy> / sys / kernel / mm / transparent_hugepage / enabled
fi

if test -f / sys / kernel / mm / transparent_hugepage / defrag; następnie
   echo nigdy> / sys / kernel / mm / transparent_hugepage / defrag
fi

poczekaj 1 && servie mongod restart

a może ktoś z powodzeniem dodał powyższe wiersze do skryptu inicjującego w Ubuntu 14.04?

Edik Mkoyan
źródło
0

Ponieważ wdrażamy maszyny z Ansible, nie lubię modyfikować plików rc.

Próbowałem użyć sysfsutils/, sysfs.confale wystąpiły problemy z czasem podczas uruchamiania usług na szybkich (lub wolnych komputerach). Wyglądało na to, że czasami mongod był uruchamiany przed sysfsutils. Czasami działało, a czasem nie.

Ponieważ mongod jest procesem przyspieszonym, odkryłem, że najczystszym rozwiązaniem było dodanie pliku /etc/mongo_vm_settings.confo następującej treści:

# 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

Spowoduje to uruchomienie skryptu tuż przed uruchomieniem mongod. Uruchom ponownie mongod ( sudo service mongod restart) i gotowe.

Dlaczego?
źródło
Zauważ, że to rozwiązanie wykorzystuje system inicjujący „Upstart”, podczas gdy Ubuntu 16.04 jest oparty na systemowym systemie inicjującym.
Mark Stosberg,
0

Po przeczytaniu trochę w dzienniku ostrzegawczym dodałem te dwie linie w /etc/sysfs.confy voilá

kernel/mm/transparent_hugepage/enabled = never
kernel/mm/transparent_hugepage/defrag = never

Uruchom ponownie komputer po zastosowaniu tych zmian.

Ulv3r
źródło
To wciąż wymaga sysfsutilspakietu (patrz moja odpowiedź).
David Foerster
na pewno jest to potrzebne
Ulv3r