PostgreSQL TDE jest wersją PostgreSQL typu Open Source, która szyfruje dane przed ich bezpiecznym przechowywaniem na dysku. Jest to zatem bezpieczniejsza, a tym samym bardziej gotowa do zastosowania w przedsiębiorstwie odmiana bazy danych. Dlatego CYBERTEC PostgreSQL Enterprise Edition (PGEE) również w dużym stopniu opiera się na szyfrowaniu.

Analiza wydajności PostgreSQL

Ludzie często pytają o różnice w wydajności między zaszyfrowanym i nieszyfrowanym PostgreSQL. Aby odpowiedzieć na to pytanie, przeprowadziliśmy kompleksową analizę wydajności, aby rzucić nieco światła na ten ważny temat i dać użytkownikom możliwość porównania różnych ustawień PostgreSQL i ich wydajności. Nasze testy wydajności zostały przeprowadzone przy użyciu następujących komponentów sprzętowych i programowych:

Konfiguracja sprzętu

CPU: AMD Ryzen 5950X — 16 cores / 32 thread, 72MB cache, support for AES-NI

MEMORY: 64GB RAM — DDR4 2666 ECC dual channel

STORAGE: SSD Samsung 980 PRO — nvme, PCIe v4 ×4

prosty wolumin lvm, system plików XFS, wyłączne użycie

Oprogramowanie w użyciu

OS: Linux Centos 7.9.2009, kernel 5.10.11-1.el7.elrepo.x86_64

PostgreSQL: postgresql13-13.1-3PGDG.rhel7.x86_64 from PGDG repo

PostgreSQL 13.1 TDE: zbudowany lokalnie ze standardowymi opcjami kompilacji używanymi dla pakietów PGDG przy użyciu podstawowej bazy GCC 4.8.5 20150623 (Red Hat 4.8.5-44)

PostgreSQL 13.1 TDE: zbudowany lokalnie ze standardowymi opcjami kompilacji używanymi dla pakietów PGDG przy użyciu kolekcji oprogramowania devtoolset-9 GCC 9.3.1 20200408 (Red Hat 9.3.1-2) i -march=znver2

Użyliśmy kilku skryptów, aby uruchomić te testy w sposób zautomatyzowany. Można pobrać narzędzia za darmo z naszego Githuba.

Notatki boczne

Ponieważ wyniki zostały wykonane na dysku półprzewodnikowym bez odpowiedniego zarządzania TRIM, przygotowywana jest druga wersja wszystkich tych analiz, z odpowiednim TRIM (opcja montażu odrzucanego -o) i skalami dostosowanymi, aby lepiej podkreślić wpływ zestawu danych na dostępne pamięć:

  • małe (rząd wielkości mniejszy niż wspólne bufory) – skala 12
  • tuż poniżej limitu wspólnych buforów (90% wspólnych buforów) – skala 900
  • większe niż bufory współdzielone, ale nadal mieści się w pamięci RAM (120% buforów współdzielonych) – skala 1600
  • większa niż RAM (120% RAM) – skala 5000

Pozostałe parametry i oprzyrządowanie będą takie same.

Metodologia benchmarkingu dla PostgreSQL

Wszystkie testy zostały wykonane lokalnie przy użyciu świeżo zainicjowanego, pustego klastra (świeży initdb). Dlatego efekty buforowania po stronie PostgreSQL nie mają znaczenia.

Przetestowano następujące konfiguracje:

  1. stock — standardowa instalacja PostgreSQL przy użyciu binariów z pakietów PGDG.
  2. TDE-4 — Instalacja PostgreSQL TDE z wyłączonym szyfrowaniem, przy użyciu binariów skompilowanych za pomocą gcc 4.8
  3. TDE-9 — Instalacja PostgreSQL TDE z wyłączonym szyfrowaniem, przy użyciu binariów skompilowanych z gcc 9.3 i zoptymalizowanych dla znver2
  4. TDE-4-e — Instalacja PostgreSQL TDE z włączonym szyfrowaniem, przy użyciu binariów skompilowanych za pomocą gcc 4.8
  5. TDE-9-e — Instalacja PostgreSQL TDE z włączonym szyfrowaniem, przy użyciu binariów skompilowanych z gcc 9.3 i zoptymalizowanych dla znver2

Prosimy zauważyć, że nie tylko porównaliśmy standardowy PostgreSQL z PostgreSQL TDE, ale także wypróbowaliśmy różne wersje kompilatorów. Można się przekonać, że kompilator rzeczywiście ma duży wpływ, co dla wielu może być zaskoczeniem.

Konfiguracja PostgreSQL

Użyto następującej konfiguracji PostgreSQL (postgresql.conf). Zmienne te zostały określone za pomocą wzoru CYBERTEC configurator:

max_connections = 100
unix_socket_directories = '/var/run/postgresql'
port = 15432
shared_preload_libraries = 'pg_stat_statements'
shared_buffers = 16GB
work_mem = 64MB
maintenance_work_mem = 620MB
effective_cache_size = 45GB
effective_io_concurrency = 100
huge_pages = try
track_io_timing = on
track_functions = pl
wal_level = logical
max_wal_senders = 10
synchronous_commit = on
checkpoint_timeout  = '15 min'
checkpoint_completion_target = 0.9
max_wal_size = 1GB
min_wal_size = 512MB
wal_compression = on
wal_buffers = -1
wal_writer_delay = 200ms
wal_writer_flush_after = 1MB
bgwriter_delay = 200ms
bgwriter_lru_maxpages = 100
bgwriter_lru_multiplier = 2.0
bgwriter_flush_after = 0
max_worker_processes = 16
max_parallel_workers_per_gather = 8
max_parallel_maintenance_workers = 8
max_parallel_workers = 16
parallel_leader_participation = on
enable_partitionwise_join = on
enable_partitionwise_aggregate = on
jit = on

Rozmiary baz danych podczas testu były następujące:

  • 15: 244–287MB
  • 20: 332–404MB
  • 25: 400–458MB
  • 30: 479–543MB
  • 35: 557–629MB
  • 50: 793–880MB
  • 500: 7849–8028MB
  • 5000: 78409–78756MB (exceeds total available memory)

Dla każdego współczynnika skali zmierzono następujące punkty odniesienia (przy użyciu opcji domyślnych):

  • standardowy test porównawczy tylko do odczytu (wbudowany pgbench)
  • standardowy benchmark odczytu/zapisu podobny do TPC (wbudowany pgbench) – przed każdym uruchomieniem TPC baza była ponownie indeksowana, aby uniknąć wpływu wykorzystania indeksu na wyniki

Współbieżność jest głównym czynnikiem, jeśli chcesz przeprowadzić benchmark w środowisku zawodowym. Zastosowano następujące ustawienia:

  • 12
  • 16 — liczba rdzeni fizycznych
  • 20
  • 24
  • 28
  • 32 —liczba wątków sprzętowych
  • 36
  • 40
  • 44
  • 48

Wyniki testów porównawczych PostgreSQL

Testy porównawcze tylko do odczytu dla PostgreSQL TDE

Poniższa sekcja zawiera wyniki naszego dochodzenia. Zacznijmy od testu porównawczego tylko do odczytu i współczynnika skali 50, co przekłada się na 880 MB danych (mała baza danych):

R-O
50
connectionsstockTDE-4TDE-4-eTDE-9TDE-9-e
12598.004,94652.870,65640.867,94651.161,67668.317,19
16717.080,83806.152,21795.300,37794.494,71821.915,21
20735.584,04813.589,44801.139,14807.197,44829.891,65
24757.834,24818.350,37809.893,87817.332,59832.810,15
28865.626,22911.020,73896.977,27909.858,10916.804,18
321.095.158,471.212.918,761.175.538,121.182.331,491.233.930,94
36885.519,57958.732,55931.091,56967.514,37986.631,16
40847.388,93943.701,45915.369,45919.076,23964.899,29
44830.018,15914.696,79901.860,60913.789,27954.813,04
48818.142,23916.199,48894.018,17901.936,11964.656,08

 

Spójrz na pierwszy rząd (12 połączeń). Standard PostgreSQL will yield 598.000 read-only transactions per second which is a good number. Ogólnie stwierdziliśmy, że obecnie procesory AMD są naprawdę wydajne i znacznie przewyższają IBM POWER9 i wiele innych. Zauważyliśmy, że kompilator robi prawdziwą różnicę. 651 tys. TPS vs. 598 tys. TPS to imponująca 9% poprawa, która w zasadzie jest „za darmo”. gcc 9 radzi sobie tutaj naprawdę dobrze.

TDE performance R-O 50

Poniższy obrazek przedstawia podstawową architekturę PostgreSQL TDE:

TDE architecture

Ważne jest również, aby zobaczyć, że zasadniczo nie ma różnicy między przebiegami zaszyfrowanymi i niezaszyfrowanymi. Powód tego jest prosty: PostgreSQL szyfruje 8k bloków przed wysłaniem ich na dysk i odszyfrowuje je, gdy blok jest pobierany z systemu operacyjnego. Dlatego nie ma różnicy między wydajnością zaszyfrowaną i nieszyfrowaną. To, co widzicie, to zasadniczo fluktuacje, których można się całkowicie spodziewać.

 

Przyjrzyjmy się tym samym danym. W tym przypadku używamy współczynnika skali 500, co przekłada się na 8 GB danych

R-O
500
connectionsstockTDE-4TDE-4-eTDE-9TDE-9-e
12583.003,70623,487,99611.303,93615.277,51628.507,18
16723.460,41772.852,04750.083,11761.129,07782.628,12
20750.054,44782.333,97770.649,65778.393,73795.200,14
24755.796,29792.365,30773.744,79787.903,80802.164,80
28842.270,11890.584,06872.163,41886.265,42895.721,71
321.087.753,871.166.292,931.124.810,041.133.026,801.170.395,10
36881.376,33926.521,14901.508,03914.466,29948.293,12
40860.762,15911.308,67875.478,96911.961,05912.369,46
44857.354,28895.126,03863.349,07878.027,97916.855,40
48853.062,65881.192,84858.566,69882.463,09910.616,50

 

Obraz jest bardzo podobny do tego, który zaobserwowaliśmy w przypadku małej bazy danych. Nadal jesteśmy w 100% w pamięci RAM i dlatego nie ma rzeczywistej różnicy w wydajności między PostgreSQL TDE z włączonym lub wyłączonym szyfrowaniem. To, co widzicie, to głównie wahania:

TDE performance R-O 500

 

Ostateczny test został przeprowadzony przy współczynniku skali 5000. Ważną częścią jest to, że baza danych urosła tak duża, że nie ma już możliwości przechowywania jej w pamięci RAM. W ten sposób możemy zaobserwować znaczny spadek wydajności:

R-O
5000
connectionsstockTDE-4TDE-4-eTDE-9TDE-9-e
1278.858,9275.226,3974.968,6580.913,5382.063,75
16104.880,2799.974,7599.921,82106.414,78107.763,35
20126.328,88120.898,40119.139,41124.199,94125.980,44
24143.740,06139.041,17134.917,30136.937,95140.407,50
28156.813,58152.443,32147.754,62148.286,04152.065,41
32170.999,35162.929,84156.527,94157.810,55164.181,20
36180.937,04171.578,25165.513,33167.660,63172.848,70
40189.501,24180.439,46173.084,98174.142,58179.936,11
44196.615,29187.607,67178.765,27179.044,87185.212,72
48201.491,30192.716,50183.124,81183.379,49190.149,00

 

Należy pamiętać, że przejście na dysk jest wielokrotnie droższe niż wykonanie jakiejś arytmetyki wskaźników w pamięci współdzielonej. Do każdego indywidualnego zapytania dodawane jest duże opóźnienie, co prowadzi do niskiego TPS, jeśli nie ma wystarczającej liczby połączeń. Na dyskach SSD efekt ten można nieco zredukować, dodając nieco więcej współbieżności. Jednak dodawanie współbieżności działa tylko do pewnego momentu, dopóki pojemność dysku nie zostanie przekroczona.

TDE performance R-O 5000

Testy porównawcze odczytu i zapisu dla PostgreSQL TDE

Po tym krótkim wprowadzeniu do testów porównawczych tylko do odczytu możemy skupić się na obciążeniach odczytu i zapisu. Używamy tutaj standardowych mechanizmów dostarczanych przez pgbench.

Pierwszą rzeczą, jaką zauważamy, jest to, że wydajność jest znacznie niższa. Są ku temu dwa powodyt:

  • Transakcja odczytu i zapisu w pgbench ma o wiele więcej poleceń
  • PostgreSQL musi opróżnić (fsync) zmiany na dysku podczas zatwierdzania

Rzućmy okiem na dane:

TPC
50
connectionsstockTDE-4TDE-4-eTDE-9TDE-9-e
123.580,133.520,692.014,562.014,162.024,19
164.537,574.493,652.548,152.565,762.547,17
205.311,455.374,373.002,805.091,042.995,52
246.192,006.208,623.432,044.998,443.420,59
286.904,776.766,713.784,674.923,473.803,69
327.626,487.473,484.134,594.725,004.139,35
368.040,797.838,614.456,765.474,014.463,35
408.389,518.408,854.697,797.043,244.713,90
448.971,148.853,694.983,574.982,574.965,51
489.246,479.085,385.191,757.751,705.170,42

 

Cena szyfrowania zaczyna mówić. Widzimy, że wydajność zaszyfrowanych wariantów może być znacznie niższa niż w przypadku konfiguracji nieszyfrowanej.

TDE performance tpc 50

 

Obraz jest podobny w przypadku zwiększenia ilości danych do współczynnika skali pgbench wynoszącego 500:

TPC
500
connectionsstockTDE-4TDE-4-eTDE-9TDE-9-e
124.088,594.098,602.201,373.106,543.080,33
165.417,765.372,612.818,173.400,993.278,76
206.716,896.688,043.437,783.712,333.672,65
247.792,777.903,354.021,374.484,284.576,07
289.061,497.850,114.631,354.926,105.150,77
3210.399,7010.428,755.235,095.515,015.818,24
3611.631,8211.737,265.811,996.056,266.381,50
4012.998,9112.986,146.349,066.911,436.526,33
4414.201,9814.301,646.913,727.360,127.472,31
4814.908,4115.259,677.489,468.097,427.650,18

 

TDE performance TPC 500

 

Przyjrzyjmy się teraz testowi przy użyciu współczynnika skali 5000. Wyraźnie widzimy, że ogólna wydajność dramatycznie spada. Powodem jest oczywiście to, że wiele danych musi pochodzić z dysku. W związku z tym widzimy spory czas oczekiwania i opóźnień na dysku:

TPC
5000
connectionsstockTDE-4TDE-4-eTDE-9TDE-9-e
124.232,584.350,822.176,312.183,952.167,18
165.466,425.259,302.908,342.960,762.908,90
204.791,086.854,993.385,013.415,353.381,12
244.676,965.967,643.983,863.993,323.994,85
284.568,794.544,864.514,534.547,604.537,21
325.151,625.085,775.058,355.087,525.029,79
365.658,665.718,435.507,315.616,755.511,39
406.138,716.167,155.952,185.948,256.007,10
446.437,956.569,216.453,016.356,466.432,60
486.968,817.012,236.807,956.845,926.791,73

 

TDE performance TPC 5000

Warto pamiętać, że wszystkie wyniki należy traktować z przymrużeniem oka. Czasy działania zawsze mogą się nieznacznie różnić. Jest to szczególnie ważne, jeśli używane są dyski SSD. Widzieliśmy to w kółko. Poziom wydajności, którego możemy się spodziewać, będzie również w dużym stopniu zależał od wydajności pamięci podręcznej PostgreSQL. Należy pamiętać: za każdym razem, gdy blok jest wysyłany na dysk lub odczytywany do współdzielonych buforów, musi nastąpić magia szyfrowania/deszyfrowania. Dlatego może mieć sens uruchamianie PostgreSQL TDE z wyższymi ustawieniami shared_buffers niż normalnie, w celu zmniejszenia wpływu na bezpieczeństwo.

SKONTAKTUJ SIĘ Z NAMI

Jeśli dążycie do lepszej wydajności bazy danych PostgreSQL, zapraszamy do zapoznania się z naszą ofertą usług konsultingowych. Pomożemy Ci znacznie przyspieszyć twoją bazę danych. Oferujemy terminową dostawę, profesjonalną obsługę i ponad 20-letnie doświadczenie w PostgreSQL.

Skontaktuj się z nami>>

 

Również: zachęcamy do sprawdzenia PostgreSQL Transparent Data Encryption, aby uzyskać przejrzyste i bezpieczne kryptograficznie szyfrowanie danych na poziomie klastra. TDE pomaga zabezpieczyć najcenniejszy zasób: Państwa dane.

Sprawdź TDE >>