DEV Community 👩‍💻👨‍💻

Zeki Ahmet Bayar for Açıklab

Posted on

Postgresql Uzaktan Benchmark Testi

Merhaba, bu yazıda HAProxy arkasında yer alan bir postgresql clusterına uzaktan nasıl benchmark testi yapabileceğimizi konuşacağız.

Başlamadan önce yazıyı yazarken tasarladığım ortamın hangi elemanlardan oluştuğundan bahsetmekte fayda var.

  1. 1 adetHAProxy
  2. 2 adet Etcd
  3. 2 adet Postgresql-14 node (2 GB RAM, 32GB Disk alanı)

Öncelikle eğer yedekli bir yapımız olmasaydı nasıl benchmark testi yapabileceğimizden bahsedebiliriz. Bunun için tek bir gereksinimimiz bulunmakta, o da postgresql-contrib paketi. Postgresql kurulu debian tabanlı bir sunucuda aşağıdaki gibi bağımlılığımızı kuralım.

sudo apt install postgresql-contrib
Enter fullscreen mode Exit fullscreen mode

Bu paket ile beraber pgbench komutu kullanıma hazır hale gelmiş oluyor. Doğru kurulduğunu görmek için aşağıdaki gibi yardım parametresini çalıştırabiliriz.

zeki@kubuntu21:~$ pgbench --help
pgbench is a benchmarking tool for PostgreSQL.

Usage:
  pgbench [OPTION]... [DBNAME]

Initialization options:
  -i, --initialize         invokes initialization mode
  -I, --init-steps=[dtgGvpf]+ (default "dtgvp")
                           run selected initialization steps
  -F, --fillfactor=NUM     set fill factor
  -n, --no-vacuum          do not run VACUUM during initialization
  -q, --quiet              quiet logging (one message each 5 seconds)
  -s, --scale=NUM          scaling factor
  --foreign-keys           create foreign key constraints between table
.
..
....
Enter fullscreen mode Exit fullscreen mode

Komutumuzun çalıştığından emin olduktan sonra işlemlerimize başlayabiliriz.

1. Pgbench için gerekli tabloları initalize etmek

Pgbench'i kullanmadan önce -i parametresi ile aşağıdaki gibi initalize edelim.

sudo -u $DATABASE_USER pgbench -i -p $DATABASE_PORT -d $DATABASE_NAME
Enter fullscreen mode Exit fullscreen mode
sudo -u postgres pgbench -i -p 5432 -d postgres
dropping old tables...
NOTICE:  table "pgbench_accounts" does not exist, skipping
NOTICE:  table "pgbench_branches" does not exist, skipping
NOTICE:  table "pgbench_history" does not exist, skipping
NOTICE:  table "pgbench_tellers" does not exist, skipping
creating tables...
generating data (client-side)...
100000 of 100000 tuples (100%) done (elapsed 0.42 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 3.90 s (drop tables 0.01 s, create tables 0.69 s, client-side generate 0.72 s, vacuum 0.48 s, primary keys 2.01 s).
Enter fullscreen mode Exit fullscreen mode

2. Pgbench'i çalıştırmak

Pgbench testimizi aşağıdaki gibi başlatabiliriz.

sudo -u $DATABASE_USER pgbench -c $CLIENT_NUM -j $JOB_NUM -t $TRANSACTION_NUM -d $DATABASE_NAME > benchmark.results
Enter fullscreen mode Exit fullscreen mode

Yukarıda verilen formattaki parametreleri anlamak, yapacağımız test için de önemli olacağından öncelikle bunları anlayalım.

$DATABASE_USER : Veri tabanı kullanıcısı, varsayılan bir veri tabanında işlem yapmak için postgres kullanılabilir.
$CLIENT_NUM : Benchmark sırasında çalışacak eşzamanlı veritabanı sayısı.
$JOB_NUM : Benchmark sırasında çalışacak thread sayısı.
$TRANSACTION_NUM : Her bir clientın yapacağı transaction sayısı.
$DATABASE_NAME : Benchmark yapılacak veri tabanı adı, varsayılan veri tabanında işlem yapmak için postgres kullanılabilir.
Enter fullscreen mode Exit fullscreen mode

Yukarıda yer alan formata göre örnek bir benchmark çalıştırdığımızda aşağıdaki gibi görünecektir.

sudo -u postgres pgbench -c 2 -j 2 -t 100 -d postgres  > benchmark.results
Password: 
pgbench: pghost: 10.0.x.5 pgport: 5432 nclients: 3 nxacts: 100 dbName: postgres
starting vacuum...end.
pgbench: client 0 executing script "<builtin: TPC-B (sort of)>"
pgbench: client 0 executing \set aid
pgbench: client 5 executing script "<builtin: TPC-B (sort of)>"
pgbench: client 5 executing \set aid
pgbench: client 0 executing \set bid
pgbench: client 0 executing \set tid
pgbench: client 5 executing \set bid
.
..
...
Enter fullscreen mode Exit fullscreen mode

İşlem tamamlandığında aşağıdaki gibi bir log dosyası üretilecektir. Bu dosya içerisinde yer alan bilgiler benchmark testimizin sonuçlarını ifade etmektedir. Benim kullandığım basic sistem için veriler aşağıda yer almaktadır.

pgbench (14.2 (Debian 14.2-1.pgdg110+1))
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 2
number of threads: 2
number of transactions per client: 100
number of transactions actually processed: 200/200
latency average = 71.099 ms
initial connection time = 9.067 ms
tps = 28.129593 (without initial connection time)
Enter fullscreen mode Exit fullscreen mode
  1. Uzaktan pgbench çalıştırmak

Yukarıdakilere ek olarak pgbench parametrelerine yalnızca HAProxy ip adresi ve postgresql portunu eklemek yeterlidir. Aşağıdaki gibi çalıştırılabilir.

sudo -u postgres pgbench -c 2 -j 2 -t 100 -d postgres -h 10.0.x.5 -p 5000 > benchmark.results
Password: 

pgbench: client 0 receiving
pgbench: client 2 executing \set aid
pgbench: client 2 executing \set bid
pgbench: client 2 executing \set tid
pgbench: client 1 receiving
pgbench: client 2 executing \set delta
pgbench: client 2 sending BEGIN;
pgbench: client 1 sending INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (6, 1, 73134, 4493, CURRENT_TIMESTAMP);
pgbench: client 1 receiving
pgbench: client 2 receiving
pgbench:pgbench: client 1 receiving
.
..
...
Enter fullscreen mode Exit fullscreen mode

Çıktı olarak aşağıdaki gibi bir sonuç görebiliriz.

pgbench (14.4 (Ubuntu 14.4-0ubuntu0.22.04.1), server 14.2 (Debian 14.2-1.pgdg110+1))
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 2
number of threads: 2
number of transactions per client: 100
number of transactions actually processed: 200/200
latency average = 48.882 ms
initial connection time = 15.425 ms
tps = 40.914923 (without initial connection time)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)

Head to your account's Settings to...

🌚 Enable dark mode
🔠 Change your default font
📚 Adjust your experience level to see more relevant content