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:
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
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]
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?
źródło
Odpowiedzi:
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:
Wpisz hasło roota.
Teraz jesteś rootem, sprawdźmy bieżącą wartość: / proc / sys / vm / max_map_count
Zmieńmy to:
Sprawdźmy:
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
umieść wszystkie parametry w pliku rc.local, przykład:
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
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:
próbować:
Działa na Ubuntu.
Zweryfikować:
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
źródło
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_count
sysctl 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ą:
źródło
Możesz postępować zgodnie z oficjalnymi instrukcjami:
Aby zmienić na stałe zaktualizuj ustawienie vm.max_map_count w /etc/sysctl.conf
Zobacz https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html
źródło