OrientDB - dostrajanie wydajności
W tym rozdziale można uzyskać ogólne wskazówki dotyczące optymalizacji aplikacji korzystającej z OrientDB. Istnieją trzy sposoby na zwiększenie wydajności dla różnych typów baz danych.
Document Database Performance Tuning - Wykorzystuje technikę, która pomaga uniknąć tworzenia dokumentów dla każdego nowego dokumentu.
Object Database Performance Tuning - Wykorzystuje ogólne techniki w celu poprawy wydajności.
Distributed Configuration Tuning - Wykorzystuje różne metodologie w celu poprawy wydajności w konfiguracji rozproszonej.
Ogólne dostrojenie wydajności można osiągnąć, zmieniając ustawienia pamięci, maszyny JVM i połączenia zdalnego.
Ustawienia pamięci
Istnieją różne strategie w ustawieniach pamięci, aby poprawić wydajność.
Serwer i ustawienia wbudowane
Te ustawienia obowiązują zarówno w przypadku komponentu serwera, jak i maszyny JVM, w której aplikacja Java jest uruchamiana przy użyciu bazy danych OrientDB w trybie osadzonym, bezpośrednio przy użyciu plocal.
Najważniejszą rzeczą przy strojeniu jest upewnienie się, że ustawienia pamięci są prawidłowe. To, co może zrobić prawdziwą różnicę, to właściwe zrównoważenie między stertą a pamięcią wirtualną używaną przez mapowanie pamięci, szczególnie w przypadku dużych zestawów danych (GB, TB i więcej), w których struktury pamięci podręcznej są mniej liczone niż surowe operacje we / wy.
Na przykład, jeśli możesz przypisać maksymalnie 8 GB do procesu Java, zwykle lepiej jest przypisać małą stertę i duży bufor pamięci podręcznej dysku (pamięć poza stertą).
Wypróbuj następujące polecenie, aby zwiększyć pamięć sterty.
java -Xmx800m -Dstorage.diskCache.bufferSize=7200 ...
Plik storage.diskCache.bufferSize ustawienie (ze starym "lokalnym" magazynem było to file.mmap.maxMemory) jest w MB i informuje, ile pamięci użyć dla składnika Disk Cache. Domyślnie jest to 4 GB.
NOTE - Jeśli suma maksymalnego bufora sterty i pamięci podręcznej dysku jest zbyt wysoka, może to spowodować wymianę systemu operacyjnego z ogromnym spowolnieniem.
Ustawienia JVM
Ustawienia maszyny JVM są kodowane w plikach wsadowych server.sh (i server.bat). Możesz je zmienić, aby dostroić maszynę JVM zgodnie z ustawieniami użytkowania i sprzętu. Dodaj następujący wiersz w pliku server.bat.
-server -XX:+PerfDisableSharedMem
To ustawienie wyłącza zapisywanie informacji debugowania na temat maszyny JVM. Jeśli musisz sprofilować maszynę JVM, po prostu usuń to ustawienie.
Połączenia zdalne
Dostęp do bazy danych przy użyciu połączenia zdalnego można zwiększyć na wiele sposobów.
Pobieranie strategii
Podczas pracy ze zdalną bazą danych należy zwrócić uwagę na zastosowaną strategię pobierania. Domyślnie klient OrientDB ładuje tylko rekord zawarty w zestawie wyników. Na przykład, jeśli zapytanie zwróci 100 elementów, ale jeśli przekroczysz te elementy z klienta, klient OrientDB leniwie ładuje elementy z jeszcze jednym wywołaniem sieciowym do serwera dla każdego nieodebranego rekordu.
Pula połączeń sieciowych
Każdy klient domyślnie używa tylko jednego połączenia sieciowego do komunikacji z serwerem. Wiele wątków na tym samym kliencie współużytkuje tę samą pulę połączeń sieciowych.
W przypadku wielu wątków może wystąpić wąskie gardło, ponieważ dużo czasu spędza się na oczekiwaniu na wolne połączenie sieciowe. To jest powód, dla którego ważne jest, aby skonfigurować pulę połączeń sieciowych.
Konfiguracja jest bardzo prosta, tylko 2 parametry -
minPool- Jest to początkowa wielkość puli połączeń. Wartość domyślna jest skonfigurowana jako parametry globalne „client.channel.minPool”.
maxPool- Jest to maksymalny rozmiar, jaki może osiągnąć pula połączeń. Wartość domyślna jest skonfigurowana jako parametry globalne „client.channel.maxPool”.
Jeśli wszystkie połączenia puli są zajęte, wątek klienta będzie czekał na pierwsze wolne połączenie.
Przykładowe polecenie konfiguracji przy użyciu właściwości bazy danych.
database = new ODatabaseDocumentTx("remote:localhost/demo");
database.setProperty("minPool", 2);
database.setProperty("maxPool", 5);
database.open("admin", "admin");
Rozproszone dostrajanie konfiguracji
Istnieje wiele sposobów na poprawę wydajności w konfiguracji rozproszonej.
Użyj transakcji
Nawet jeśli aktualizujesz wykresy, zawsze powinieneś pracować nad transakcjami. OrientDB pozwala na pracę poza nimi. Typowe przypadki to kwerendy tylko do odczytu lub masowe i niespójne operacje mogą zostać przywrócone w przypadku awarii. W przypadku pracy w konfiguracji rozproszonej użycie transakcji pomaga zmniejszyć opóźnienia. Dzieje się tak, ponieważ operacja rozproszona ma miejsce tylko w momencie zatwierdzenia. Dystrybucja jednej dużej operacji jest znacznie wydajniejsza niż przesyłanie małych operacji wielokrotnych ze względu na opóźnienia.
Replikacja a fragmentowanie
Konfiguracja rozproszona OrientDB jest ustawiona na pełną replikację. Posiadanie wielu węzłów z tą samą kopią bazy danych jest ważne dla odczytów skali. W rzeczywistości każdy serwer jest niezależny od wykonywania odczytów i zapytań. Jeśli masz 10 węzłów serwera, przepustowość odczytu wynosi 10x.
W przypadku zapisów jest odwrotnie: posiadanie wielu węzłów z pełną replikacją spowalnia operacje, jeśli replikacja jest synchroniczna. W takim przypadku dzielenie bazy danych na fragmenty w wielu węzłach umożliwia skalowanie zapisów w górę, ponieważ podczas zapisu bierze udział tylko podzbiór węzłów. Co więcej, możesz mieć bazę danych większą niż jeden węzeł serwera HD.
Zwiększ skalę na podstawie zapisów
Jeśli masz powolną sieć i masz synchroniczną (domyślną) replikację, możesz zapłacić koszt opóźnienia. W rzeczywistości, gdy OrientDB działa synchronicznie, czeka przynajmniej nawriteQuorum. Oznacza to, że jeśli writeQuorum to 3, a masz 5 węzłów, węzeł serwera koordynującego (na którym rozpoczyna się operacja rozproszona) musi czekać na odpowiedź z co najmniej 3 węzłów, aby udzielić odpowiedzi klientowi.
Aby zachować spójność, writeQuorum powinno być ustawione na większość. Jeśli masz 5 węzłów, większość to 3. Przy 4 węzłach nadal jest to 3. Ustawienie opcji writeQuorum na 3 zamiast 4 lub 5 pozwala zmniejszyć koszt opóźnienia i nadal zachować spójność.
Asynchroniczna replikacja
Aby przyspieszyć działanie, możesz skonfigurować replikację asynchroniczną, aby usunąć wąskie gardło związane z opóźnieniami. W takim przypadku węzeł serwera koordynującego wykonuje operację lokalnie i udziela odpowiedzi klientowi. Cała replikacja będzie odbywać się w tle. Jeśli kworum nie zostanie osiągnięte, zmiany zostaną cofnięte w sposób przezroczysty.
Zwiększ skalę odczytów
Jeśli już ustawiłeś writeQuorum dla większości węzłów, możesz zostawić readQuorumna 1 (domyślnie). Przyspiesza to wszystkie odczyty.