PostgreSQL – Pgbench Nedir? Nasıl Kurulur?

PostgreSQL – Pgbench Nedir? Nasıl Kurulur?
14 Ağu 2023

Pgbench, PostgreSQL veritabanı üzerinde benchmark testleri yapmamızı sağlayan bir PostreSQL aracıdır. Veritabanı trafiğinin simüle edilmesi ile stres testi yapmamıza olanak sağlar. Bu benchmark testleri ile farklı senaryoları önceden test edip buna uygun konfigürasyon değişikliklerini veya kaynak artırımlarını yapmamız mümkün hale gelir. Bu sebeple pgbench önemli ve kullanışlı bir araçtır. Pgbench ile mevcut sunucudaki veritabanında testler yapılabileceği gibi pgpool üzerinden gidilen node üzerinde de testler yapılabilmektedir. Yazımızın devamında iki örneği de inceledik. 

 Ortam Bilgileri

192.168.1.35 – pgpool = Bu sunucuda pgpool ve boş bir postgresql veritabanı bulunmaktadır. Bu sunucudan 192.168.1.36 ve 192.168.1.37 sunucularına connection pooling yapılmaktadır. 

192.168.1.36 – node1  = Primary veritabanının kurulu olduğu node1 sunucu

192.168.1.37 – node2  = Replica veritabanının kurulu olduğu node2 sunucu

 Pgbench Kurulumu

 192.168.1.35 – pgpool sunucusunda:

 PostreSQL contrib paketi ile birlikte pgbench binary dosyaları sunucuya kurulmuş oluyor.

 Sunucuda PostreSQL servisinin ayakta olduğundan emin olup psql ile veritabanına bağlanıp pgbench testlerini yapacağımız example veritabanımızı oluşturacağız.

(3 rows)

 Example veritabanımızı oluşturduk. Şimdi pgbench ile bu veritabanını hızlıca test’e hazır hale getirelim. Bu komut ile pgbench example veritabanında örnek tabloları oluşturup bunlara data yazacak. 

Default olarak, pgbench yukarıdaki tabloları yukarıda gösterilen satır sayısıyla oluşturacaktır. Bu, basit bir 16MB veritabanı oluşturur.

 Performans değişikliklerini ölçmek için pgbench kullanacağımız için, 16 MB’lık küçük bir veritabanı testimizi kurgulamak için yeterli olmayacaktır. İşte burada -s (ölçekleme) seçeneği devreye girmektedir.

-s seçeneği, her bir tabloya girilen satır sayısını çarpmak için kullanılır. Yukarıdaki komutta 50’lik bir “ölçeklendirme ” seçeneği girdik. Bu, pgbench’e varsayılan boyutun 50 katı büyüklüğünde bir veritabanı oluşturmasını söyledi.

Bu, pgbench_accounts tablomuzun artık 5.000.000 kayda sahip olduğu anlamına geliyor. Ayrıca, veritabanı boyutumuzun yaklaşık olarak 800MB (50 x 16MB) olduğu anlamına gelir. Kontrol edelim.


Testlerimizi çeşitlendirebiliriz. Örneğin aşağıdaki komutla example veritabanına pgbench’i çağırırken, komuta epeyce seçenek ekleyebiliyoruz. İlki, bağlanılacak istemci sayısını tanımlamak için kullanılan 

 -c (client). Bu test için, pgbench’e 10 client ile test etmesi için 10 yazdık.

Böylece pgbench testleri yaparken veritabanında 10 farklı session açar.

Sonraki seçenek -j (threads) sayısıdır. Bu pgbench için çalışan thread sayısını tanımlamak için kullanılır. Aşağıdaki komutta 2 değerini belirttik. Bu, pgbench’e test sırasında iki thread başlatmasını söyleyecektir.

Üçüncü seçenek -t’dir (transactions), “çalıştırılacak transaction sayısı” olarak tanımlanır. Aşağıdaki komutta 10.000 değerini verdik. Bunun anlamı, her müşteri oturumunun 10.000 işlem yürüteceğidir.

Özetlemek gerekirse, bu komut ile 10 istemciden toplam 100.000 transaction gerçekleştirilmesini simüle etmiş olacağız.

Pgbench ile Pgpool Yük Testi 192.168.1.35 – pgpool sunucusunda:

Pgpool default olarak 9999 portunu kullanmakta. Bu port’u ve ek olarak gideceği db ve db’de kullanacağı user bilgilerini verdiğimizde testleri gerçekleştirebileceğiz. Ek olarak bu testler sonucunda pgpool’un stres altındaki dayanımını kontrol edip yüksek connection sayısı nedeniyle yaşanan pgpool hang probleminin çözümünü de gerçekleştireceğiz.

Aşağıdaki komutla pgpool üzerinden testlerimizi gerçekleştirelim. Komutta -U monitor ile kullanılacak user’ı belirttik. -p 9999 ile pgpool’a bağlantı sağlayacağı port’u, -i (initialize) ile bağlandığı veritabanında gerekli tabloları oluşturmasını, -s 100 monitor ile de ‘monitor’ veritabanına bağlanıp 100’lük bir ölçeklendirme yapmasını istedik.

 -s 100 verdik yaklaşık db boyutumuz 1.6 GB(100x16MB) olacak

 Tabloları oluşturup insert’leri yaptırdık ve bir sorun yaşamadık. Şimdi db sessionları ile bir test yapalım. Bu komutla yine monitor veritabanına pgpool üzerinden gidip 10 session ve 2 thread ile 1000 adet transaction simüle edilecek.

Aşağıdaki komutla 20 session monitor db’sine 150 saniye boyunca sürekli select atacak, her transaction için yeni connection sağlanacak. Komutu çalıştırmadan önce ve çalıştırdıktan birkaç saniye sonraki select count’lar görsellerdeki gibidir.

 

Bu komuttaki parametrelerin anlamları şu şekilde listelenmektedir (pgbench –help ile bu özellikler görüntülenebilir) :

-n : test öncesinde vacuum çalıştırılmasın,

-S : select-only transaction gerçekleştirilsin,

-p : port,

-c : client sayısı,

-C : her transaction için yeni connection açılsın,

-T : test’in kaç saniye boyunca devam ettirileceği.

 Aynı testi 4 saniyede tamamlanacak şekilde gerçekleştirip sonucu görelim, pgbench test tamamlandığında bize aşağıdaki gibi bir çıktı üretecek.

 Bu komutu 32 ve üzeri client olacak şekilde güncellediğimizde standart konfigürasyonda pgpool yeterince child process oluşturamıyor ve hang oluyor. Bunun için num_init_children (default değeri 32) adlı pgpool parametresini arttırmamız gerekiyor. Fakat bu parametreyi artırdığımızda aslında db’lere gidecek connection sayısını da artırıyoruz. Bu sebeple bu değeri artırırken dikkatli olunmalı, bu değer çok yükseltilirse db’ye kabul edebileceğinden daha fazla connection isteği giderek db’yi de hang edebilir. 

 Bu parametreyi artırdıktan sonra pgpool’u restart edip testi tekrar yaptığımızda hang probleminin yaşanmadığını görüyoruz.

Yazımızda bir PostgreSQL aracı olan pgbech ile ilgili bilgileri inceledik. GTech olarak sadece performans testleriyle sınırlı kalmadan, veritabanı mimarinizin tamamını değerlendiriyor, optimizasyon önerileri sunuyor ve size en iyi performansı sağlamak için gereken değişiklikleri uygulamanıza yardımcı oluyoruz. PostgreSQL veritabanınızın tam potansiyeline ulaşmasına yardımcı olmak için Sistem ve Veritabanı uzmanlarımızla iletişime geçebilirsiniz.

Yazar: Mahmut Can Eçanefe, GTech Sistem ve Veritabanı Yönetimi Danışmanı