Mis on programm pgbench ja kuidas seda kasutada PostgreSQLis toimuvate andmebaasioperatsioonide jõudluse uurimiseks?

Postitas Erki Eessaar 01.12.2024 12:59 (muudeti 01.12.2024 17:59)
Tegemist on utiliidiga (kindla ülesandega programmiga), mis installeeritakse serverisse koos PostgreSQLi andmebaasisüsteemiga. Seda saab kasutada selleks, et hinnata erinevate disainivalikute või keskkonna juhtparameetrite mõju andmebaasioperatsioonide jõudlusele (töökiirusele). Järgnevate käskude käivitamiseks tuleb serverisse (ssh protokolli alusel) sisse logida ning käivitada käske kooriku viibalt (shelli promptist). Siin on selle utiliidi tutvustus ja siin dokumentatsioon.

Testija saab valida kuidas toimida.
  1. Lasta pgbenchil genereerida nelja tabeliga andmebaas (tabelid pgbench_accounts, pgbench_branches, pgbench_history ja pgbench_tellers), lasta pgbenchil genereerida nendesse tabelitesse soovitud hulk testandmeid ning lasta pgbenchil käivitada selle andmebaasi põhjal valitud tehinguid (valida on kolme tehingu hulgast).
  2. Luua ise andmebaas, genereerida sinna ise testandmeid ning lasta pgbenchil käivitada selle andmebaasi põhjal enda koostatud tehinguid. 

Kasutan järgnevalt varianti 1, et hinnata tabeli FILLFACTOR juhtparameetri muutmise mõju jõudlusele. Järgnev katsetus on tehtud PostgreSQL (17) põhjal.

Loon neli andmebaasi.

createdb example1
createdb example2
createdb example3
createdb example4

Lasen pgbenchil täita need andmebaasid testtabelitega ja need tabelid testandmetega.

pgbench -i -s 50 --foreign-keys example1
pgbench -i -F 90 -s 50 --foreign-keys example2
pgbench -i -F 80 -s 50 --foreign-keys example3
pgbench -i -F 70 -s 50 --foreign-keys example4

-i - pgbench peab andmebaasi ise looma
-s 50 - koefitsent, mis määrab andmete hulga tabelites. 50 tähendab, et tabelis pgbench_accounts on 5 miljonit rida. 100 tähendaks, et selles tabelis oleks  10 miljonit rida.
  • branches = 1x
  • tellers = 10x
  • accounts = 100,000x
-F <arv> - vaikimisi luuakse tabelid FILLFACTOR väärtusega 100. See võti võimaldab määrata, millist FILLFACTOR väärtust tuleks selle asemel kasutada
--foreign-keys - loodavas andmebaasis tuleb ka defineerida välisvõtme kitsendused. Vaikimisi neid ei looda.

Lasen pgbenchil nende andmebaaside põhjal täita tehinguid.

pgbench -c 1 -T 180 -b tpcb-like example1
pgbench -c 1 -T 180 -b tpcb-like example2
pgbench -c 1 -T 180 -b tpcb-like example3
pgbench -c 1 -T 180 -b tpcb-like example4

- c 1 - kui mitu klienti andmebaasis samaaegselt tehinguid käivitavad. Vaikimisi 1. See tähendab, et ei teki konflikte erinevate klientide andmemuudatuste vahel.
- T 180 - täida tehinguid 180 sekundit. Alternatiiviks oleks kasutada -t omadust ja määrata käivitatavate tehingute arv. Määrata saab ühe või teise, kuid mitte mõlemat korraga.
-b tpcb-like - käivita programmi sisse ehitatud tehingut tpcb-like. Seal on kolm UPDATE lauset 1 SELECT ja 1 INSERT lause. Need laused leiab dokumentatsioonist.

Vastus esimese käsu korral

pgbench (17.2 (Ubuntu 17.2-1.pgdg22.04+1))
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 50
query mode: simple
number of clients: 1
number of threads: 1
maximum number of tries: 1
duration: 180 s
number of transactions actually processed: 118363
number of failed transactions: 0 (0.000%)
latency average = 1.521 ms
initial connection time = 10.513 ms
tps = 657.581951 (without initial connection time)

Number of transactions actually processed näitab täidetud tehingute arvu, latency average näitab keskmist tehingu täitmise aega ning tps (transactions per second) tehingute arvu sekundis.

Tulemused

FILLFACTOR 100
number of transactions actually processed: 118363
latency average = 1.521 ms
tps = 657.581951 (without initial connection time)

FILLFACTOR 90
number of transactions actually processed: 121877
latency average = 1.477 ms
tps = 677.133722 (without initial connection time)

FILLFACTOR 80
number of transactions actually processed: 125312
latency average = 1.436 ms
tps = 696.213099 (without initial connection time)

FILLFACTOR 70
number of transactions actually processed: 130279
latency average = 1.382 ms
tps = 723.808714 (without initial connection time)

FILLFACTOR väärtuse vähendamisel oli tulemus parem - tehingu täitmiseks kulus keskmiselt vähem, sekundis toimus rohkem tehinguid ja kokku toimus rohkem tehinguid. Samas tuleb aru saada, et katsetatud stsenaariumis käivitati väga lühikese ajaga väga palju UPDATE lauseid. Kui UPDATE lauseid käivitatakse harvem, siis võib FILLFACTOR olla suurem (nt 90).

Tabeli väiksema FILLFACTOR väärtuse tulemuseks on see, et tabeli plokkides on rohkem vaba ruumi, tabeli andmete salvestamiseks kulub rohkem plokke ning kokkuvõttes on andmebaas suurem.

Vaatasin loodud andmebaaside suurust enne katsetuste algust sellise päringuga:
SELECT pg_size_pretty(pg_database_size('__siia_andmebaasi_nimi__'));

example1 (FILLFACTOR 100): 755MB
example1 (FILLFACTOR 90): 825MB
example1 (FILLFACTOR 80): 912MB
example1 (FILLFACTOR 70): 1023MB

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!