Nie można zmienić vm.max_map_count dla elasticsearch

14

Pre-historia

Mam elasticsearch i SugarCRM7 działające na CentOS 6.5. Codziennie napotykam ten sam problem: błąd java outOfMemory. Dzieje się tak z powodu małej wartości vm.max_map_count, 65530 tylko wtedy, gdy zalecane jest 262144.

Problem

Problem polega na tym, że vm.max_map_count wydaje się niezmienny:

  1. Zmiana pod rootem

    sudo sysctl -w vm.max_map_count=262144
    

    zwroty

    błąd: odmowa dostępu do klucza „vm.max_map_count”

    Podczas

    ps aux | grep java
    

    Zwraca tylko proces grep

  2. Zmiana podczas uruchamiania elasticsearch

    sudo service elasticsearch start
    

    Zwraca również błąd

    błąd: odmowa dostępu do klucza „vm.max_map_count”

    Rozpoczęcie wyszukiwania elastycznego: [OK]

  3. Ręczne zmiany za pomocą pliku (hack brudny brud):

    sudo vi /proc/sys/vm/max_map_count
    

    Nie działa albo:

    „/ proc / sys / vm / max_map_count” [tylko do odczytu] 1L, 6C

    - INSERT - W10: Ostrzeżenie: Zmiana pliku tylko do odczytu

    E45: ustawiona jest opcja „tylko do odczytu” (dodaj!, Aby zastąpić)

    "/ proc / sys / vm / max_map_count" E212: Nie można otworzyć pliku do zapisu

    Podczas

    ls -la /proc/sys/vm/ | grep max_map_count
    

    Zwroty

    -rw-r - r-- 1 root root 0 kwi 10 09:36 max_map_count

    (Ale myślę, że może to być normalne w przypadku Linuksa mówiącego o katalogu / proc)

Jak mogę zmienić wartość tej zmiennej? Ponowne uruchamianie elasticsearch każdej nocy nie jest dobrym pomysłem ... A przynajmniej ktoś może wiedzieć, dlaczego ten błąd się zdarza?

Valentina
źródło
3
Co to za maszyna? Wirtualny? Jeśli tak, jaki rodzaj wirtualizacji jest używany? Zauważ, że niektóre wirtualizacje, np. Kontenery OpenVZ, nakładają ograniczenia na twój kontener i nie pozwalają na „modyfikowanie” jądra i innych rzeczy na niskim poziomie.
Miroslav Koškár,
@MiroslavKoskar Niestety nie wiem. Jak mogę to znaleźć?
Valentina,
@MiroslavKoskar Zapomniałem wspomnieć - maszyna jest oczywiście wirtualna
Valentina
1
Jak się dowiedzieć? Gdzie jest hostowany? Powinno to być dość oczywiste, ponieważ zwykle jest to część umowy z dostawcą usług hostingowych. W razie wątpliwości skontaktuj się ze wsparciem swojego dostawcy hostingu, IMHO to najlepsze miejsce na rozpoczęcie (ponieważ zwykle jest to część umowy i coś, za co prawdopodobnie płacisz).
Miroslav Koškár
@MiroslavKoskar dobrze, dostawca odpowiedział, nie wspominając o technologii, że nie mogą mi pomóc z tym problemem (to raczej rozsądne). Dzięki za pomoc
Valentina,

Odpowiedzi:

13

jesteś prawie na miejscu, nie ma znaczenia, czy jest to maszyna wirtualna, czy fizyczna, te ustawienia są zawsze zmienialne.

Pokażę 3 metody.

Niektóre informacje wstępne:

1) Lepiej wykonać jako root, jeśli to możliwe.

2) / proc na unixie nie jest prawdziwym systemem plików, to system plików jądra w pamięci, ale wydaje się być jak zwykły system plików na dysku. Możesz to nazwać „fałszywym systemem plików” lub „specjalnym systemem plików”, nie możesz edytować tych fałszywych plików za pomocą vi lub innego edytora, ponieważ nie są to pliki, tylko wyglądają jak pliki. Utknąłem z tym samym problemem lata temu.

Ale łatwo jest zmienić ich wartości, po prostu wymagają innego rodzaju „mechaniki”, aby je edytować.

Wyjaśnię: Po pierwsze, muszę być rootem: (sudo działa w niektórych dystrybucjach, ale nie działa w niektórych innych dystrybucjach, jak próbowałeś, ta pierwsza metoda jest uniwersalna i działa na dowolnym systemie Linux, macOS lub dowolnym systemie Unix Mam nadzieję, że masz dostęp do hasła roota.

Postępuj natychmiast:

    $ su root

Wpisz hasło roota.

Teraz jesteś rootem, sprawdźmy bieżącą wartość: / proc / sys / vm / max_map_count

    $ cat /proc/sys/vm/max_map_count  
    65536

Zmieńmy to:

    echo 262144 > /proc/sys/vm/max_map_count

Sprawdźmy:

    cat /proc/sys/vm/max_map_count
    262144

Zrobione! I jest już zastosowany i funkcjonalny. Zmieniając wartości dowolnego pseudopliku w / proc, ustawienia stają się natychmiast aktywne. Ale nie utrzymują się po ponownym uruchomieniu. Możesz grać z wartościami i mierzyć zmiany wydajności w elasticsearh lub w innych aplikacjach lub wskaźnikach systemowych. Idź dostrajając swój system, zapisując wartości na papierze, zachowaj najlepsze wartości. W razie pomyłki uruchom ponownie komputer, a wszystkie wrócą do pierwotnych wartości i zacznij od nowa, aż wszystkie pożądane wartości będą optymalne. W katalogu / proc znajduje się wiele parametrów, które można dostosować do dysku i pamięci. I robią ogromną różnicę i zwiększają wydajność, jeśli dobrze je dostroisz (i masz na to czas). Jesteś na dobrej drodze.

Po spełnieniu wymagań uczyńmy je trwałymi:

Pierwsza metoda:

using /etc/rc.local

    vi /etc/rc.local 

umieść wszystkie parametry w pliku rc.local, przykład:

    echo 220000000 > /proc/sys/vm/dirty_background_bytes
    echo 320000000 > /proc/sys/vm/dirty_bytes
    echo 0 > /proc/sys/vm/dirty_background_ratio
    echo 0 > /proc/sys/vm/dirty_ratio
    echo 500 > /proc/sys/vm/dirty_writeback_centisecs
    echo 4500 > /proc/sys/vm/dirty_expire_centisecs
    echo 1 > /proc/sys/net/ipv4/tcp_rfc1337
    echo 10 > /proc/sys/vm/swappiness
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    echo 120 > /proc/sys/net/ipv4/tcp_keepalive_time
    echo 0 > /proc/sys/vm/zone_reclaim_mode
    echo deadline > /sys/block/sda/queue/scheduler
    echo 8 > /sys/class/block/sda/queue/read_ahead_kb
    echo 1048575 > /proc/sys/vm/max_map_count

zamknij edytor vi zapisując plik.

Parametry te zostaną ustawione przy każdym ponownym uruchomieniu, PO uruchomieniu wszystkich usług inicjujących, tuż przed wyświetleniem monitu logowania.

( plik /etc/rc.local jest wykonywany po wszystkich startowych usługach Linux, może nie działać, jeśli elasticsearch rozpocznie się przed nim jako usługa, ale ta metoda może być przydatna w innej konfiguracji, jeśli zajdzie taka potrzeba w przyszłości, lub możesz użyć jej w ten sposób poprzez umieszczenie ich w skrypcie init elasticsearch, ponieważ skrypt init działa jako root, więc ta sama składnia powyżej jest używana w skryptach init)

Możesz także skopiować je teraz i wkleić w celu natychmiastowych zmian. Powyższe parametry są prawidłowe, dostrojone i działają na moim serwerze Apache Cassandra. Jeśli chcesz, wypróbuj je jako punkt początkowy, aby dostroić swój.

Drugi sposób, aby uczynić je trwałymi:

Parametry zostaną teraz ustawione PRZED jakąkolwiek usługą startową na Linuksie.

Edytuj plik /etc/sysctl.conf , umieść w nim parametry

 vm.max_map_count=1048575
 vm.zone_reclaim_mode=0
 vm.dirty_background_bytes=220000000
 vm.dirty_background_ratio=0
 vm.dirty_bytes=320000000
 vm.dirty_ratio=0
 vm.swappiness=10

kontynuuj pracę z innymi, zapisz /etc/sysctl.conf , uruchom ponownie serwer, aby zastosować zmiany, lub wykonaj: sysctl -p, aby zastosować zmiany bez ponownego uruchomienia. Będą trwałe po ponownym uruchomieniu.

Dwie metody powyżej są najbardziej powszechne. Jest jeszcze jeden, i może działać dla ciebie, używając sudo , prawie tak jak robiłeś:

zamiast:

  sudo sysctl -w vm.max_map_count=262144

próbować:

  echo 262144 | sudo tee /proc/sys/vm/max_map_count

Działa na Ubuntu.

Zweryfikować:

   user@naos:~$ cat /proc/sys/vm/max_map_count
   262144

Mam nadzieję, że jakoś pomogłem, przynajmniej dając 3 różne opcje rozwiązania problemu, ponieważ twoje pytanie ma prawie rok;)

Pozdrawiam Rafael Prado

użytkownik62739
źródło
3
Oni już to zrobili i to się nie udało.
Michael Hampton
1
Cześć Michael, tak masz rację. Z początku zrozumiałem, że problem dotyczy systemu operacyjnego CentOS i uprawnień użytkownika unix, więc podążyłem tą linią w odpowiedzi. Jednak nowsze informacje koncentrują się na problemie „hosta” OpenVZ, co ogranicza niektóre ustawienia. Moja wiedza dotyczy Centos i VmWare, ale nie dotyczy OpenVZ.
user62739,
4

Myślę, że twoja „maszyna wirtualna” jest w rzeczywistości kontenerem OpenVZ (który możesz to sprawdzić, uruchamiając virt-what).

W takim przypadku nie można zmienić vm.max_map_countsysctl ani wielu innych. Wartości są stałe.

Jest to dobrze znany problem z elasticsearch ( numer 4978 ). To nie tylko Elasticsearch. Wiadomo, że aplikacje Java działają słabo na różnych dostawcach OpenVZ, głównie dlatego, że hosty są często źle dostrojone i nic nie można na to poradzić. Jeden z komentatorów tej kwestii powtórzył dokładnie to, co byłoby moją rekomendacją:

joshuajonah skomentował 20 października 2015
To szalone. Chyba przejdę na KVM VPS.

Michael Hampton
źródło