2016-03-02 9 views
8

Ludzie,Omówienie użycia stosu jvm elastycznego przeszukiwania

Próbuję zmniejszyć zużycie pamięci podczas wdrażania elastycznego wyszukiwania (klastra z pojedynczym węzłem).

Widzę 3 GB przestrzeni JVM stosu. Aby zoptymalizować, najpierw muszę zrozumieć wąskie gardło. Mam ograniczoną wiedzę na temat dzielenia użycia JVM.

Dane pola wyglądają na zużywające 1,5 GB i pamięć podręczną filtru & Pamięć podręczna zapytań łącznie zużywa mniej niż 0,5 GB, która dodaje maksymalnie 2 GB na maksimum.

Czy ktoś może mi pomóc zrozumieć, skąd program elasticsearch zjada resztę 1 GB?

Marvel screenshot

Odpowiedz

13

Nie mogę powiedzieć dla twojej dokładnej konfiguracji, ale żeby wiedzieć, co się dzieje w twoim stosie, możesz użyć narzędzia jvisualvm (dołączonego do jdk) razem z cudem lub bigdesk plugin (moje preferencje) i _cat APIs, aby przeanalizować, co się dzieje.

Jak już słusznie zauważył, sterty gospodarze trzy główne buforuje, a mianowicie:

Dostępna jest dobra mapa umysłu here (Kudos to Igor Kupczyński), która podsumowuje role pamięci podręcznych. To pozostawia mniej więcej ~ 30% sterty (1 GB w twoim przypadku) dla wszystkich innych obiektów, które ES musi utworzyć, aby działały poprawnie (więcej informacji na ten temat w dalszej części).

Oto, jak postępowałem w moim lokalnym środowisku. Najpierw uruchomiłem mój węzeł (z Xmx1g) i czekałem na zielony status. Potem zacząłem jvisualvm i zacząłem go stosować w procesie elastycznego wyszukiwania. Zrobiłem zrzut sterty z zakładki Sampler, dzięki czemu mogę go później porównać z innym zrzutem.Moja kupa wygląda to początkowo (tylko 1/3 maks sterty przydzielone do tej pory):

enter image description here

Sprawdziłem też, że moje dane terenowe i buforuje filtry były puste:

enter image description here

Aby się upewnić, uruchomiłem także /_cat/fielddata i jak widzisz, nie ma stosu używanego przez dane pola od momentu uruchomienia węzła.

$ curl 'localhost:9200/_cat/fielddata?bytes=b&v' 
id      host  ip   node total 
TMVa3S2oTUWOElsBrgFhuw iMac.local 192.168.1.100 Tumbler  0 

To jest sytuacja początkowa. Teraz musimy to wszystko nieco ogrzać, dlatego zacząłem aplikacje z zaplecza i frontonu, aby wywrzeć presję na lokalnym węźle ES.

Po pewnym czasie moja kupa wygląda tak, więc jego rozmiar jest mniej lub bardziej wzrosła o 300 MB (139MB -> 452MB, niedużo, ale wpadłem ten eksperyment na małym zbiorze)

enter image description here

Moi buforuje także uprawiane trochę do kilku megabajtów:

enter image description here

$ curl 'localhost:9200/_cat/fielddata?bytes=b&v' 
id      host  ip   node  total 
TMVa3S2oTUWOElsBrgFhuw iMac.local 192.168.1.100 Tumbler 9066424 

W tym momencie wziąłem anoth er zrzut sterty, aby uzyskać wgląd w ewolucję sterty, obliczyłem obiekty i porównałem je z pierwszym zrzutem, który zrobiłem zaraz po uruchomieniu węzła. Porównanie wygląda tak:

Wśród obiektów, które zwiększyły się w zachowanym rozmiarze, zwykle podejrzanymi są oczywiście mapy oraz wszelkie jednostki związane z pamięcią podręczną. Ale możemy również znaleźć następujące klasy:

  • NIOFSDirectory, które są używane do odczytu plików segmentu Lucene w systemie plików
  • dużo internowanych strun w postaci tablic char lub tablic bajtowych
  • wartości Doc powiązanych klasy
  • zestawy Bit
  • itp

enter image description here

Jak widać, sterty zawierają trzy główne pamięci podręczne, ale jest to także miejsce, w którym znajdują się wszystkie inne obiekty Java, których potrzebuje proces Elasticsearch, i które niekoniecznie są buforowane.

Więc jeśli chcesz kontrolować zużycie sterty, oczywiście nie masz kontroli nad obiektami wewnętrznymi, które ES musi funkcjonować prawidłowo, ale możesz zdecydowanie wpływać na rozmiar twoich pamięci podręcznych. Jeśli podążysz za łączami na pierwszej liście punktorów, otrzymasz dokładne informacje o ustawieniach, które możesz dostroić.

Również dostrajanie pamięci podręcznych może nie być jedyną opcją, może trzeba przepisać niektóre zapytania, aby były bardziej przyjazne dla pamięci lub zmienić analizatory lub niektóre typy pól w mapowaniu itp. Trudno powiedzieć w twoim przypadku, bez dodatkowych informacji, ale to powinno dać ci kilka potencjalnych klientów.

Śmiało i uruchom jvisualvm w taki sam sposób, jak tutaj, i dowiedz się, jak rośnie twój stos, podczas gdy twoja aplikacja (wyszukiwanie i indeksowanie) uderza w ES i powinieneś szybko uzyskać wgląd w to, co się tam dzieje.

+0

Dzięki Val za szczegółową odpowiedź! Udało mi się znaleźć sposób na użycie wartości doc do niektórych ciężkich zapytań agregacyjnych, które powinny bardzo pomóc w mojej sprawie :) – Nullpoet

+0

Niesamowite, cieszę się, że było to pomocne. Dzięki za nagrodę ;-) – Val

1

Marvel działki tylko kilka przykładów na stercie, które muszą być monitorowane jak Podręcznej w tej sprawie.

Pamięć podręczna stanowi tylko część całkowitego użycia sterty. Istnieje wiele innych instancji, które zajmą pamięć sterty, a te mogą nie mieć bezpośredniego plotowania w tym interfejsie marvel.

W związku z tym Nie wszystkie sterty zajmowane w ES to tylko pamięć podręczna.

Aby dokładnie zrozumieć dokładne użycie sterty przez różne instancje, należy wykonać zrzut sterty procesu, a następnie przeanalizować go za pomocą narzędzia Memory Analyzer, które zapewnia dokładny obraz.