TStorage – testy wydajnościowe

Na stronie zawarto opis testu wydajności różnych baz danych zaprojektowanych do efektywnego przetwarzania szeregów czasowych. W ramach testu porównujemy:

  • TStorage
  • InfluxDBv1
  • TimescaleDB

Test ma na celu porównanie wydajności zapisu, a także odczytu danych. Źródłem danych jest symulacja pracy serwerów znajdujących się w centrach danych. Wielkością odczytową są różne parametry procesora. Test ten jest przygotowany na podstawie zadań wykorzystywanych przez ogólnodostępny, popularny zestaw wykorzystywany do porównywania wydajności pomiędzy bazami danych szeregów czasowych – TSBS (Time Series Benchmark Suite) „cpu-only”. Więcej informacji na temat tego testu można znaleźć tutaj: https://github.com/timescale/tsbs


Sprzęt wykorzystany do testów

Każdy test został wykonany na tym samym sprzęcie:

  • dysk twardy z systemem operacyjnym: HDD 2TB SATA 6Gb/s 512n 7,2 tys. obr./min 3,5″
  • dyski twarde przeznaczone na bazę danych oraz źródło rekordów: HDD 4TB SATA 6Gb/s 512n 7,2 tys. obr./min 3,5″
  • pamięć RAM: 8 * 16GB pamięci RDIMM, 5600MT/s
  • procesor: Intel Xeon Silver 4514Y, 2GHz, 16 rdzeni / 32 wątki, 16GT/s, 30 MB pamięci podręcznej, Turbo, HT (150W) DDR5-4400
  • karta sieciowa: Broadcom 57504 Quad Port 10/25 GbE, SFP28, OCP 3.0 NIC

Przygotowanie baz danych do testów:

Test w każdym przypadku został uruchomiony lokalnie, z 1 dyskiem wykorzystywanym na system operacyjny i obsługę testu, 1 dyskiem przechowującym dane testowe oraz 1 dyskiem wykorzystywanym na wyłączność przez testowaną bazę. Jeśli baza danych korzystała z dodatkowych mechanizmów logujących dopuszczona była możliwość generowania ich na dysk systemu operacyjnego. Użyty system plików to XFS dla dysków z danymi testowymi i bazą danych oraz ext4 dla systemu operacyjnego – Debian 12.

TimescaleDB:

W celu przygotowania bazy TimescaleDB korzystamy z udostępnionej instrukcji instalacji najnowszej wersji bazy opisanej tutaj: https://docs.timescale.com/self-hosted/latest/install/installation-linux/

Konfiguracja TimescaleDB została zmodyfikowana tak, aby foldery, które zawierają wrzucone dane znalazły się na oddzielnym dysku, a właścicielem bazy danych był użytkownik „tstorage”. Do zapewnienia zgodności działającej instancji z zaleceniami jej twórców uruchomiony został dodatkowo program „timescaledb-tune”, aby zapewnić odpowiednie dobranie parametrów konfiguracyjnych.

InfluxDB:

Baza InfluxDB została zainstalowana na podstawie oficjalnych paczek znajdujących się w repozytorium pakietów Debian 12 w wersji „1.6.7~rc0-1+b13”. Konfiguracja Influxa została zmodyfikowana tak, aby foldery, które zawierają wrzucone dane znalazły się na oddzielnym dysku.

TStorage:

Bazę TStorage instalujemy na podstawie najnowszego stanu znajdującego się w repozytoriach z kodem. Został skonfigurowany tak, aby wszystkie jego serwisy były uruchomione na jednym hoście, a dane były zapisywane na jednym dysku.


Przebieg testu

Test rozpoczynamy od przygotowania danych wejściowych w formacie zgodnym z mechanizmami wczytywania danej bazy danych. Dane gotowe do wysyłki są następnie kompresowane za pomocą programu „gzip”.

Dane wejściowe dla baz TimescaleDB oraz InfluxDB generowane są za pomocą skryptów udostępnionych przez test TSBS. Do każdej generacji wykorzystujemy tę samą wartość ziarna liczb pseudolosowych, aby zapewnić identyczność wyników. Dokładny opis danych:

  • ziarno generatora liczb pseudolosowych (tzw. „seed” ) = 123
  • zakres danych – 2 lata (2016-01-01 00:00:00 – 2018-01-01 00:00:00)
  • ilość liczników – 30’000
  • odległość pomiędzy kolejnymi pomiarami – 5min
  • ilość różnych wartości w każdym pomiarze – 10
  • format wartości pomiarowej – liczba całkowita

W przypadku TStorage’a do przygotowania danych wejściowych wykonywana jest konwersja formatu bazy TimescaleDB na format danych zgodny z referencyjnym klientem do bazy TStorage za pomocą odpowiedniego skryptu.

Generatory TSBS oprócz opisanych wartości liczbowych generują dodatkowe metadane na temat pomiarów. Są one ignorowane podczas umieszczania rekordów w TStorage’u, ponieważ nie są wykorzystywane podczas trwania testu. TStorage jako baza pomiarowa nie przechowuje nadmiarowych metadanych na temat rekordów.


Format danych przygotowany dla klientów

Baza InfluxDB

cpu,hostname=host_0,region=eu-central-1,datacenter=eu-central-1a,rack=6,os=Ubuntu15.10,arch=x86,team=SF,service=19,service_version=1,service_environment=test usage_user=58i,usage_system=2i,usage_idle=24i,usage_nice=61i,usage_iowait=22i,usage_irq=63i,usage_softirq=6i,usage_steal=44i,usage_guest=80i,usage_guest_nice=38i 1451606400000000000
cpu,hostname=host_1,region=us-west-1,datacenter=us-west-1a,rack=41,os=Ubuntu15.10,arch=x64,team=NYC,service=9,service_version=1,service_environment=staging usage_user=84i,usage_system=11i,usage_idle=53i,usage_nice=87i,usage_iowait=29i,usage_irq=20i,usage_softirq=54i,usage_steal=77i,usage_guest=53i,usage_guest_nice=74i 1451606400000000000
cpu,hostname=host_2,region=sa-east-1,datacenter=sa-east-1a,rack=89,os=Ubuntu16.04LTS,arch=x86,team=LON,service=13,service_version=0,service_environment=staging usage_user=29i,usage_system=48i,usage_idle=5i,usage_nice=63i,usage_iowait=17i,usage_irq=52i,usage_softirq=60i,usage_steal=49i,usage_guest=93i,usage_guest_nice=1i 1451606400000000000

Baza TimescaleDB

tags,hostname string,region string,datacenter string,rack string,os string,arch string,team string,service string,service_version string,service_environment string
cpu,usage_user,usage_system,usage_idle,usage_nice,usage_iowait,usage_irq,usage_softirq,usage_steal,usage_guest,usage_guest_nice
tags,hostname=host_0,region=eu-central-1,datacenter=eu-central-1a,rack=6,os=Ubuntu15.10,arch=x86,team=SF,service=19,service_version=1,service_environment=test
cpu,1451606400000000000,58,2,24,61,22,63,6,44,80,38

Baza TStorage

Za wartość CID przyjęliśmy ID hosta w odpowiadającej mu kolumnie hostname. MID oraz MOID zostały przyjęte jako 0, gdyż każdy z hostów generuje co 5 minut tylko 1 rekord.

0 0 0 473299200000000000 0x0000003a00000002000000180000003d000000160000003f000000060000002c0000005000000026
1 0 0 473299200000000000 0x000000540000000b00000035000000570000001d00000014000000360000004d000000350000004a
2 0 0 473299200000000000 0x0000001d00000030000000050000003f00000011000000340000003c000000310000005d00000001
3 0 0 473299200000000000 0x0000000800000015000000590000004e0000001e0000005100000021000000180000001800000052
4 0 0 473299200000000000 0x000000020000001a0000004000000006000000260000001400000047000000130000002800000036
5 0 0 473299200000000000 0x0000004c000000280000003f0000000700000051000000140000001d00000037000000140000000f

Zapisywanie rekordów

  • czyścimy zawartość dysku przechowującego dane, aby zapewnić te same warunki startowe
  • uruchamiamy testowaną bazę danych
  • uruchamiamy pomiar czasu (za pomocą systemowego narzędzia „time”)
  • uruchamiamy skrypt zapisujący dane (narzędzia udostępnione przez TSBS dla baz TimescaleDB i InfluxDB; autorskie narzędzie do umieszczania danych w TStorage’u)
  • zatrzymujemy pomiar czasu

Następnie porównujemy otrzymane wyniki. W każdym z przypadków wrzucamy 6’315’840’000 rekordów, gdzie każdy rekord przechowuje 10 pomiarów. Za porównywaną metrykę bierzemy średnią ilość rekordów zapisywanych na sekundę.


Tabela 1: Wyniki wrzucania rekordów do wybranej bazy danych.

TStorage  TimescaleDBInfluxDB
Prędkość zapisywania rekordów                    1571104 rekordów/s  269217 rekordów/s414425 rekordów/s
Czas zapisu67 min391 min254 min                     

Pobieranie danych

Przygotowaliśmy trzy scenariusze testowe do pobierania danych, wykonywane na jednym wątku. W ramach jednego scenariusza przygotowujemy 100 losowych zapytań. Aby poprawić spójność wyników dla różnych systemów buforowania danych każde zapytanie jest powtarzane, a mierzony zostaje czas wykonania drugiego zapytania. Czasy wykonania są mierzone wewnątrz właściwych skryptów wykonujących pracę. Aby ograniczyć wpływ zewnętrznych czynników na wyniki testów nie wyświetlamy na ekranie rezultatów zapytań (choć każde wykorzystane narzędzie udostępnia taką możliwość do potwierdzenia spójności wyników).


Scenariusze testowe

  1. Pojedyncze zapytanie polega na losowym wybraniu jednego hosta, jednej metryki oraz 12-godzinnego przedziału czasu, a następnie pobraniu wszystkich pomiarów z tego zakresu.*        
  2. Pojedyncze zapytanie polega na losowym wybraniu jednego hosta oraz 12-godzinnego przedziału czasu, a następnie pobraniu wszystkich pomiarów dla każdej metryki z tego zakresu.*
  3. Losujemy 12-godzinny przedział czasu i jedną wartość pomiarową. Wyliczamy średnią wartość pomiarową dla godzinnych interwałów dla wszystkich liczników (dla każdego z liczników oddzielnie).

Wyniki testów

Tabela 2: Średni czas wykonania zapytań testowych dla poszczególnych baz danych.

Numer scenariuszaTStorageTimescaleDBInfluxDB
11ms135ms2ms    
21ms    176ms            6.5ms 
3397ms2090ms          4277ms          

Podsumowanie

W naszych testach porównywaliśmy wydajność trzech baz danych pod względem zapisywania i odczytywania rekordów generowanych przez duże ilości liczników. W obu przypadkach porównywaliśmy wersje 1-węzłowe zapisujące do 1 dysku. Testy pokazały, że niezależnie od tego czy użytkownik preferuje zapis czy odczyt danych, to dla tak zdefiniowanych scenariuszy pracy TStorage okazał się preferowanym rozwiązaniem.