pgbench - Benchmarking PostgreSQL

Database

Benchmarking ist das Mittel der Wahl zum Testen und Tunen der Leistungsfähigkeit eines relationalen Datenbankmanagementsystems (RDBMS). Das Open Source RDBMS PostgreSQL bietet bereits eine Reihe von Tools, um Datenbankadministratoren und Entwicklern das Leben zu erleichtern. pgbench ist das Benchmarking Tool, welches direkt mit der Installation von PostgreSQL verfügbar wird.

pgbench wiederholt beim Standardskript periodisch dieselbe Aufeinanderfolge von SQL Befehlen. Dieses setzt sich aus fünf SELECT, UPDATE und INSERT Operationen pro Transaktion zusammen. Darauf basierend wird die durchschnittliche Transaktionsrate pro Sekunde (tps = transactions per second) bestimmt. Neben den Standardskripten von pgbench können auch eigene, auf besondere Anforderungen ausgelegte Skripte verwendet werden. Einer dieser Performancetests ist ausschließlich mit SELECT Anweisungen vorbereitet, um lediglich das Lesen auf den Standby-Instanzen zu benchmarken.

pgbench einrichten

Bevor nun pgbench ausgeführt werden kann, wird eine separate Datenbank für den Test angelegt.

 

createdb testdb

 

pgbench -i testdb

dropping old tables...
HINWEIS:  Tabelle »pgbench_accounts« existiert nicht, wird übersprungen
HINWEIS:  Tabelle »pgbench_branches« existiert nicht, wird übersprungen
HINWEIS:  Tabelle »pgbench_history« existiert nicht, wird übersprungen
HINWEIS:  Tabelle »pgbench_tellers« existiert nicht, wird übersprungen
creating tables...
generating data...
100000 of 100000 tuples (100%) done (elapsed 0.12 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done.

 

Dabei wird standardmäßig mit einem Skalierungsfaktor (-s) von Eins eine Menge von Zeilen in vier Tabellen erzeugt. Die vier Tabellen können einfach per psql CLI angezeigt werden.

 

psql -d testdb -c "\dt"

table                   # of rows
---------------------------------
pgbench_branches        1*s
pgbench_tellers         10*s
pgbench_accounts        100000*s
pgbench_history         0

 

Die Datenbank hat nach dem Initialisieren ohne weitere Parameter eine Größe von ca. 23 MB.

 

SELECT pg_size_pretty(pg_database_size('testdb'));
 pg_size_pretty
----------------
 23 kB
(1 Zeile)

 

Die Anzahl der Zeilen pro Tabelle wird in diesem Beispiel mit dem Skalierungsfaktor 10 vergrößert. Nun hat die Testdatenbank eine Größe von ca. 160 MB.

 

pgbench -i -s 10 testdb

dropping old tables...
creating tables...
generating data...
100000 of 1000000 tuples (10%) done (elapsed 0.11 s, remaining 1.01 s)
...
1000000 of 1000000 tuples (100%) done (elapsed 1.84 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done.

Test durchführen

pgbench bietet eine ganze Reihe von Parametern um die Art und Weise der Ausführung anzupassen. Häufig verwendete Parameter sind:

 

-j Worker Threads für die simulierten Clients
-c Anzahl der simulierten Clients
-t Anzahl an ausgeführten Transaktionen pro Client
-T Testzeitraum in Sekunden

 

Alle Parameter sind in der pgbench Dokumentation zu finden.

Jetzt kann der erste Test gestartet werden!

In diesem Szenario wird der Standardtest verwendet. Fünf Clients führen jeweils 10000 Transaktionen auf der Testdatenbank aus.

 

pgbench -c 10 -j 2 -t 10000 testdb

starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 10
query mode: simple
number of clients: 10
number of threads: 2
number of transactions per client: 10000
number of transactions actually processed: 100000/100000
latency average = 20.338 ms
tps = 491.681519 (including connections establishing)
tps = 491.687229 (excluding connections establishing)

 

Die Ausgabe zeigt zuerst Informationen zum Test bezüglich der verwendeten Parameter an. Danach wird die ermittelte Transaktionsrate (tps) angezeigt. Je höher der Wert ist, umso besser das Ergebnis.

Der TPS Wert kann nun als Baseline für das Performance Tuning genutzt werden.

Performance Tuning

Die folgenden Schritte stellen für gewöhnlich den Ablauf beim Tuning per pgbench dar:

Konfigurationsdatei postgresql.conf oder per ALTER SYSTEM Befehl die Konfigurationsparameter nach Bedarf anpassen (je nach Parameter Instanz neustarten) Test wiederholen mit gleichen Parametern TPS Wert mit vorherigem Wert vergleichen und bei einem höheren Wert Konfigurationsparameter weiter anpassen, bei einem niedrigeren Wert geänderte Konfigurationsparameter zurücksetzen

Als Beispiel wird der Konfigurationsparameter shared_buffers erhöht. Dies kann mit einem ALTER SYSTEM Befehl erfolgen.

 

psql -d testdb -c "ALTER SYSTEM SET shared_buffers = '1024MB';"

 

Mit dem ALTER SYSTEM Befehl wird der neue Wert für die shared_buffers in der postgresql.auto.conf gespeichert.

Yannic Nevado Autor

Yannic Nevado ist ein Datenbank-Consultant bei der Proventa AG. Seine Schwerpunkte liegen beim Open Source und EDB Postgres. Er arbeitet mit Kunden daran neue Datenbanksysteme einzuführen. Des Weiteren unterstützt er Migrationen von Oracle und DB2  zu Postgres. DevOps mit Containern und Kubernetes gehören außerdem zu seinem Alltag. Gerne teilt er sein neu erlangtes Wissen bei der Postgres User Group Frankfurt weiter.

Tags