PostgreSQL Veritabanında Yazma İşlemlerini Etkileyen Faktörler ve Hızlandırmak

Hüseyin Demir
7 min readMar 28, 2021

Merhabalar, bu yazımda PostgreSQL veritabanındaki yazma işlemlerini ele almaya çalışacağım. Bu çalışma kapsamında da, PostgreSQL üzerinde yazma hızını etkileyen faktörleri değerlendirmeye ve etkilerini aktarmaya çalışacağım. PostgreSQL bildiğimiz üzere, ilişkisel bir veritabanıdır ve “master-slave” modelde çalışır. Yani yazma istekleri sadece master olarak isimlendirilen sunucu ile karşılanır. Bu nedenle de yazma işlemlerindeki hacim ve buna karşılık elde ettiğimiz performans önemlidir. Bu çalışmada da yazma hızını nelerin etkilediğini, hangi faktörlerde nasıl sonuçlar elde ettiğimizi aktarmayaca çalışacağım.

PostgreSQL üzerinde yazma hızını etkileyen ya da etkilemesi muhtemel faktörler aşağıdaki gibidir. (Aslında neredeyse tüm ilişkisel veritabanlarında ve çoğu NoSQL veritabanında geçerli olabilir aşağıdaki maddeler)

  1. Veritabanı versiyonu
  2. Veritabanı konfigürasyonu
  3. Veritabanı Replikasyon faktörleri ve etkileri
  4. İşletim sistemi konfigürasyonları

Senaryo 1 — Veritabanı Versiyonu

Veritabanı versiyonu da veritabanı üzerindeki performansı etkileyebilecek önemli bir faktördür. Bu test senaryosunda doğrudan postgresql sürümlerinin farklı olmasının yazma performası üzerindeki etkisi var mı sorusuna cevap arayacağız. Bunun içinde, 2 adet farklı postgresql sunucusunda postgresql 11 ve postgresql 13 versiyonları üzerinde aynı yük testleri yapılacaktır.

Sunucu İşletim Sistemi : CentOS 7.6
Disk Tipi : SSD Local
CPU : 8 Cores
Memory : 16 GB

Aşağıdaki test komutu ile birlikte PostgreSQL veritabanı üzerine sadece yazma işlemi yapılmaktadır. İlk önce PostgreSQL 11 sürümüne sahip sunucuya test uygulanmıştır.

INSERT INTO test_table VALUES(‘test’,1)

PostgreSQL 11 Veritabanı Yük Testi Sonuçları

Veritabanı Versiyonu : PostgreSQL 11.11 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5–44), 64-bit
İstemci Sayısı(Number of Clients) : 100
Thread Sayısı : 100
Shared Buffer Değeri : 4GB
Süre : 300 saniye

PostgreSQL 13 Veritabanı Yük Testi Sonuçları

Veritabanı Versiyonu : PostgreSQL 13.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5–44), 64-bit
İstemci Sayısı(Number of Clients) : 100
Thread Sayısı : 100
Shared Buffer Değeri : 4GB
Süre : 300 saniye

Bu testlerden görülebileceği üzere, aynı şartlar altında PostgreSQL 13 sürümünde birim zamanda yazılan kayıt sayısının ortalaması PostgreSQL 11 sürümüne göre daha fazladır. 300 saniye içerisinde 400.000'e yakın kayıt daha fazla yazılmayı başarmıştır.

Bununla birlikte TPS değerinde de 2.000 kadar fark vardır. Yani PostgreSQL 13 sürümünde saniyede 2.000 INSERT işlemi daha başarılı bir şekilde tamamlanmıştır. Yazma hızı ve potansiyeli olarak eşit şartlarda PostgreSQL 13 sürümü ortalama olarak daha performanslı görülmektedir.

Senaryo 2 — PostgreSQL Konfigürasyonları

Bu senaryoda ise, aynı sunucu özelliklerine ve postgresql sürümlerine sahip iki farklı veritabanı örneği karşılaştırılmıştır. Bu senaryoda sadece postgresql konfigürasyonları değiştirilmiştir. Bu kapsamda da konfigürasyonların etkisi ölçülmüştür. Değiştirilen postgresql konfigürasyonları, veritabanın disk,memory ve bakım işlerini etkileyen parametrelerdir. İki farklı konfigürasyon kalıbı hazırlanmıştır. Bunlar, öntanımlı/standart konfigürasyon ve iyileştirilmiş(tuned) konfigürasyon setleridir. Bu iki farklı örneğe, 10 dakika boyunca insert işlemleri uygulanmıştır.

Değiştirilen parametrelerin listesi ise aşağıdaki gibidir.

ALTER SYSTEM SET shared_buffers TO ‘4GB’;
ALTER SYSTEM SET effective_cache_size TO ‘8GB’;
ALTER SYSTEM SET checkpoint_timeout TO ‘15min’;
ALTER SYSTEM SET checkpoint_completion_target TO ‘0.9’;
ALTER SYSTEM SET random_page_cost TO 1.1;
ALTER SYSTEM SET effective_io_concurrency TO 200;
ALTER SYSTEM SET synchronous_commit to off;

Burada değiştirilen tüm konfigürasyonlar tamamen test amaçlı değiştirilmiştir. O nedenle sizlerde kendi sistemlerinizde testler ile doğru konfigürasyonlara karar verebilirsiniz. Burada yaptığım çalışma tamamen PostgreSQL veritabanı üzerinedir. Bu değerler kesinlikle konfigürasyon önerisi değildir.

Bu testlerde görüleceği üzere, yazma üzerine performans artışı sağlamak için değiştirdiğimiz tuned konfigürasyon setinde öntanımlı konfigürasyon setine göre gözle görülür bir yazma performans farkı mevcuttur. Yazılan kayıtların sayısı olarak aradaki fark neredeyse 2 katı aynı şekilde TPS(saniyedeki işlem sayısı) değerleri arasında da neredeyse 2 katı bir fark mevcuttur. Ancak burada göz ardı edilmemesi gereken en önemli parametre synchronous_commit parametresidir. Bu parametre öntanımlı olarak “on” değerindedir. Bu parametre açık olduğunda bir INSERT işleminin diske başarılı yazıldığından emin olunur. Yani gönderilen bir I/O istediğinin başarılı olana kadar beklenmesi işlemidir bu işlem. Bu nedenle de her bir yazma işleminin başarılı olduğunu veritabanı teyit etmektedir. Ancak bu ayarı kaldırdığımızda bu kontrol yapılmamaktadır. Bu parametrenin getirdiği en büyük kazanım yüksek performans kazanımıdır ancak dezavantajı da sunucu ya da veritabanı birim zamanda crash olduğunda veri kaybı olabilir. O nedenle iyi analiz edilip ihtiyaca yönelik kullanılması gerekiyor.

Senaryo 3 — Replikasyon Etmeni

Üçüncü senaryomuzda ise, veritabanı sistemlerindeki replikasyonlarının yazma performansı üzerindeki etkilerini inceleyeceğiz. Bu senaryoda tek sunucu, async replikasyona sahip 2 sunuculu kümeyi ve sync replikasyona sahip 2 sunuculu kümeler arasındaki performans farkını inceleyeğiz. Bu testlerde kullanılan sunucuların birbirlerinin aynısıdır. Diğer detaylar ise aşağıdaki gibidir.

Sunucu Tipi : CentOS 7.6
Disk : Local SSD
PostgreSQL Sürüm : PostgreSQL 13
PostgreSQL Konfigürasyonu : Öntanımlı(Default değerler)

Bu kapsamda, 3 farklı ortama yapılan testlerin sonucu aşağıdaki gibidir. Sonuçlardan görüleceği üzere, standalone ve async replikasyona sahip ortamlarda yazma performansı sync replikasyona sahip ortam ile karşılaştırıldığında göze çarpacak kadar fazladır.

Yine görülebileceği üzere, standalone mimariye sahip ortamda yazma performansı, ortalama gecikme süresi ve TPS değerleri async replikasyona sahip ortama göre daha iyidir. Oran olarak çok yüksek bir oran olmasada, kayıt sayısı ve saniyede başarılı gerçekleşen transaction sayısında arada bir hayli büyük fark vardır. Sync replikasyondaki farklılığın sebebi ise PostgreSQL sync modda replikasyon yapıldığında INSERT işlemi önce replika olan sunucuda başarılı olarak gerçekleştirilir ardından da master(primary) sunucuda gerçekleştirilmektedir en sonunda ise istemciye başarılı mesajı iletilmektedir. Bu nedenle arada bir fark mevcuttur.Buradan elde ettiğimiz bilgi ile çıkarım yapacak olursak, PostgreSQL veritabanı sistemlerinde sync replikasyon sunucularının detaylı analiz edilerek ayarlanması gerekiyor. Çünkü ihtiyaç fazlası kullanılıyorsa bu sisteme performans olarak olumsuz bir etki bırakmaktadır. Ya da sync dediğimiz sunucuda yaşanabilecek ekstra bir disk probleminden ötürü yavaşlıkta doğrudan yazma performansı master üzerinde olumsuz etkilenecektir.

Senaryo 4 — İşletim Sistemi Konfigürasyonları

Sonuncu senaryo ise, işletim sistemi konfigürasyonlarının postgresql insert performansına etkisi olup olmadığını görmektir. Bu kapsamda, iki adet standalone tipinde sunucuda sadece işletim sistemi konfigürasyonları farklı olarak şekilde ayarlama yapılmıştır. Üstüne koşulan testte sadece yazma odaklı bir testtir. İşletim sisteminde, aşağıdaki konfigürasyonlar değiştirilmiştir. Bu konfigürasyonlardaki amaç yazma hızını arttırmaktır.

vm.swappiness=0
vm.dirty_background_ratio=0
kernel.sched_migration_cost_ns=50000000
kernel.sched_min_granularity_ns=10000000
vm.dirty_background_bytes=67108864
vm.dirty_bytes=536870912
vm.dirty_ratio=0
vm.zone_reclaim_mode=0
fs.file-max=30000000
fs.suid_dumpable=0
kernel.randomize_va_space=2

Sunucu Tipi : CentOS 7.6
Disk : Local SSD
PostgreSQL Sürüm : PostgreSQL 13
PostgreSQL Konfigürasyonu : Öntanımlı(Default değerler)

Bu çalışmada da görüleceği üzere, tuned dediğimiz konfigürasyon setinde belirlenen süre içerisinde daha fazla başarılı INSERT isteği karşılanmıştır. Yazma performansını arttırmak için tek başına işletim sisteminin de etkisinin olduğunu görmüş olduk. Ancak bu etki tek başına yüzde anlamında büyük fark yapacak bir etki değildir. Diğer faktörler gibi sayısal olarak fark etmektedir.

Çalışma Sonuçları

Bu çalışma sonucunda, görmüş olduğumuz gibi PostgreSQL üzerinde yazma(INSERT) performansını etkileyen ya da etkileyebilecek birçok faktör vardır. Önemli olan nokta, bu faktörleri nasıl ve nerede kullanacağımız belirlemektir. Çünkü tüm bu faktörler ve ayarlar bizim ihtiyacımıza göre değiştirebileceğimiz etkenlerdir. Ancak yinede, aşağıdaki sonuçları çıkarmak mümkündür.

  1. Güncel veritabanı sürümlerini kullanmak yazma performansını iyileştirecektir. Özellikle PostgreSQL 13 gibi optimize ve stabil sürümleri tercih edebiliriz daha yüksek TPS ve yazma kapasitesi için
  2. PostgreSQL konfigürasyonlarını yazma işlemlerine yönelik ayarlayabiliriz. Ancak, bu konfigürasyonlar sistemde başka noktalara etki edilebilir o nedenle dikkatli olunmalıdır.
  3. PostgreSQL replikasyon yapısının yazma performansı üzerinde büyük bir etkisi vardır. Standalone,sync ve async tarzı yapılandırmalarda tamamen amacı yönelik hareket edilmelidir. Özellikle sync replikasyonlarda oluşan büyük fark vardır.
  4. İşletim sistemi konfigürasyonları da PostgreSQL yazma performansına etki etmektedir. Ancak etkisi yüzde olarak çok büyük değildir. Yine de diğer faktörler ile birleştiğinde büyük bir etkinin parçası olacaktır.

Tüm bu faktörlerin aynı anda etkin olduğu bir ortam ile öntanımlı bir ortamı karşılaştırdığımızda daha da büyük farklar görmemiz muhtemel. Ancak bu yazıdaki ve çalışmadaki amacım, bu faktörlerin tek başına bıraktığı etkileri görmek ve incelemekti. Umarım faydalı olmuştur ilgisi ve merakı olanlar için. Twitter,Github ve Youtube gibi platformlardan da ulaşalabilirsiniz linklerini ekledim.

Sevgiler.

Demir

Referans

https://www.enterprisedb.com/postgres-tutorials/comprehensive-guide-how-tune-database-parameters-and-configuration-postgresql

https://www.enterprisedb.com/postgresql-performance-optimizing-tuning-database-configurations-parameters-benchmark

--

--