dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Ana Sayfa/Veritabanları/postgresql/Derin Mimari/PostgreSQL WAL Mimarisi, Full Page Writes ve Checkpoint Yayma Optimizasyonu
PostgreSQL → Performance Tuning → Memory Management
Derin Mimari & I/O Mimarisiintermediate / advanced20 dakika okuma
PostgreSQL (14–18)

PostgreSQL WAL Mimarisi, Full Page Writes ve Checkpoint Yayma Optimizasyonu

Write-Ahead Log (WAL) mimarisi, Full Page Writes (FPW), checkpoint yayma optimizasyonu ve yoğun yazma iş yüklerinde disk I/O dalgalanmalarını önleme rehberi.

PG
Senior Database Reliability Engineer & PostgreSQL Specialist
dbaguide.com PostgreSQL Derin Mimari Serisi
Standart: Buffered I/O•Kernel: Linux Page Cache•Blok: 8 KB Shared Buffers

PostgreSQL WAL Mimarisi, Full Page Writes ve Checkpoint Yayma Optimizasyonu

Kategori: PostgreSQL → Performance Tuning → Storage & WAL Teknik seviye: Intermediate / Advanced Okuma süresi: 18–22 dakika Yayın Serisi: DBA Guide | PostgreSQL Internals & Performance Tuning | İleri Seviye Teknik Makale

PostgreSQL performansını değerlendirirken genellikle sorgu optimizasyonu, indeks tasarımı, bellek yönetimi ve disk I/O üzerinde durulur. Ancak özellikle yoğun yazma işlemleri gerçekleştiren sistemlerde performansı doğrudan etkileyen başka bir mekanizma daha vardır: Write-Ahead Logging (WAL), Full Page Writes ve Checkpoint yönetimi arasındaki ilişki.

Bu üç mekanizma birbirinden bağımsız değildir. Checkpoint sıklığı, Full Page Writes nedeniyle oluşan WAL hacmini etkiler. WAL hacmindeki artış ise disk yazma yükünü, replikasyon trafiğini, arşivleme maliyetlerini ve recovery süreçlerini etkileyebilir.

Bu makalede PostgreSQL'in WAL mimarisini inceleyecek, Full Page Writes mekanizmasının veri bütünlüğünü nasıl koruduğunu açıklayacak ve checkpoint yayma (*checkpoint spreading*) optimizasyonunu gerçek sistemlerde nasıl uygulayabileceğimizi ele alacağız.


1. PostgreSQL WAL Mimarisi Nasıl Çalışır?

Write-Ahead Logging, PostgreSQL'in veri bütünlüğü ve crash recovery mekanizmasının temelini oluşturur.

WAL'ın temel prensibi şudur:

Temel İlke: Bir veri sayfasındaki değişiklik kalıcı veri dosyasına yazılmadan önce, ilgili değişikliği yeniden oluşturmak için gerekli WAL kayıtları dayanıklı depolamaya yazılmış olmalıdır.

Bu yaklaşım sayesinde PostgreSQL, beklenmedik kapanma veya sistem çökmesi sonrasında veritabanını tutarlı bir duruma geri getirebilir.

▸1.1 WAL Yazma Akışı

PostgreSQL WAL Architecture – Overall Flow
PostgreSQL WAL Architecture – Overall Flow

*Şekil 1 — Basitleştirilmiş WAL ve veri sayfası yazma akışı. WAL yazımı ile dirty page yazımı ayrı yollardan ilerler.*

Bir UPDATE işlemi gerçekleştiğinde PostgreSQL genel olarak şu adımları izler:

  1. 1İlgili veri sayfası Shared Buffers içerisinde değiştirilir ve dirty olarak işaretlenir.
  2. 2Değişikliği temsil eden WAL kayıtları oluşturulur.
  3. 3WAL kayıtları WAL buffer üzerinden WAL dosyalarına aktarılır.
  4. 4Commit işleminin dayanıklılık gereksinimine göre WAL uygun noktaya kadar flush edilir.
  5. 5Dirty veri sayfaları daha sonra background writer, checkpoint veya gerektiğinde backend süreçleri tarafından veri dosyalarına yazılır.

Buradaki önemli nokta, transaction commit işleminin normal şartlarda değiştirilmiş bütün veri sayfalarının diske yazılmasını beklememesidir.

▸1.2 WAL Dosyalarının Yapısı

WAL kayıtları, PostgreSQL veri dizini altındaki pg_wal klasöründe segmentler halinde tutulur.

Varsayılan WAL segment boyutu 16 MB'dir. Ancak cluster oluşturulurken farklı bir segment boyutu belirlenebilir.

sql
SHOW wal_segment_size; SHOW wal_level; SHOW wal_buffers; SHOW wal_compression;

WAL segmentleri yalnızca crash recovery için kullanılmaz. Ayrıca şu süreçlerin temelini oluşturur:

  • •Physical streaming replication
  • •Point-in-Time Recovery (PITR)
  • •WAL archiving
  • •Backup ve recovery
  • •Logical decoding ve logical replication

Bu nedenle WAL üretim miktarındaki artış yalnızca primary sunucunun disk performansını değil, tüm PostgreSQL veri altyapısını etkileyebilir.


2. Full Page Writes (FPW) Nedir?

PostgreSQL veri sayfalarının varsayılan boyutu 8 KB'dir.

sql
SHOW block_size; SHOW full_page_writes;

Bir PostgreSQL veri sayfasının diske yazılması sırasında işletim sistemi, donanım veya güç kaybı nedeniyle yazma işlemi yarım kalabilir.

Bu durum torn page veya torn write olarak adlandırılır.

Örneğin 8 KB boyutundaki bir veri sayfasının yalnızca bir bölümü diske yazılmış olabilir. Böyle bir durumda veri sayfası kendi içerisinde tutarsız hale gelebilir.

Full Page Writes mekanizması bu riski azaltmak amacıyla tasarlanmıştır.

▸2.1 Full Page Writes Nasıl Çalışır?

Full Page Writes (FPI) — How PostgreSQL protects data pages against torn writes
Full Page Writes (FPI) — How PostgreSQL protects data pages against torn writes

full_page_writes = on olduğunda PostgreSQL, bir checkpoint sonrasında ilgili veri sayfasının ilk değişikliğini WAL'a kaydederken sayfanın tam görüntüsünü (Full Page Image — FPI) de WAL kaydına ekleyebilir.

Değişiklik ZamanıWAL Kayıt İçeriğiAçıklama
İlk değişiklik (Checkpoint sonrası)8 KB Page Image (FPI)* + WAL Change RecordSayfanın tam görüntüsü saklanır
Sonraki değişikliklerSadece WAL Change RecordSadece delta/fark kaydedilir

**FPI boyutu sıkıştırma, kullanılmayan alan ve WAL kayıt biçimine göre değişebilir.*

Bu mekanizmanın önemli sonuçları vardır:

  • •Checkpoint sonrasında çok sayıda veri sayfasının ilk kez değiştirilmesi WAL hacmini artırabilir.
  • •Aynı sayfa üzerinde sonraki değişiklikler normalde yeniden tam sayfa görüntüsü gerektirmez.
  • •Yeni checkpoint döngüsüyle FPI gereksinimi yeniden oluşabilir.

Dolayısıyla checkpoint sıklığı ile Full Page Writes kaynaklı WAL hacmi arasında doğrudan bir ilişki vardır.

▸2.2 Full Page Writes Kapatılmalı mı?

Performans iyileştirmek amacıyla aşağıdaki ayarın kullanılması cazip görünebilir:

ini
full_page_writes = off

Ancak üretim sistemlerinde bu ayarın kapatılması genel olarak önerilmez.

Çünkü Full Page Writes, torn page kaynaklı veri bozulmalarına karşı temel koruma mekanizmalarından biridir. WAL hacmini azaltmak uğruna crash recovery güvenilirliğini riske atmak doğru bir optimizasyon yaklaşımı değildir.

Öneri: full_page_writes = on ayarını koruyun. WAL hacmini azaltmak için öncelikle checkpoint sıklığını, WAL compression kullanımını ve uygulamanın yazma davranışını değerlendirin.

3. Checkpoint Mekanizması

Checkpoint Process — Dirty-page writes, synchronization and recovery-point advancement
Checkpoint Process — Dirty-page writes, synchronization and recovery-point advancement

Checkpoint, PostgreSQL'in crash recovery için kullandığı önemli bir senkronizasyon noktasıdır.

Checkpoint sırasında ilgili dirty veri sayfalarının diske yazılması ve gerekli kalıcılık işlemlerinin tamamlanması sağlanır. Böylece olası bir crash sonrasında recovery işleminin başlaması gereken nokta ileri taşınabilir.

▸3.1 Checkpoint Neden Gereklidir?

Checkpoint mekanizması olmadan PostgreSQL, crash recovery sırasında çok daha eski WAL kayıtlarını işlemek zorunda kalabilir.

Checkpoint sayesinde:

  • •Crash recovery süresi kontrol altında tutulabilir.
  • •WAL geri kazanım başlangıç noktası ilerletilir.
  • •Dirty buffer yazımları yönetilebilir.
  • •WAL dosyalarının geri dönüşümü ve kaldırılması için gerekli koşulların oluşmasına katkı sağlanır.

Ancak checkpoint işlemleri disk I/O üzerinde önemli bir yük oluşturabilir.

▸3.2 Checkpoint Ne Zaman Tetiklenir?

PostgreSQL'de checkpoint işlemleri başlıca iki nedenle gerçekleşir:

Checkpoint türüTetikleyici
Time-based (Zaman tabanlı)checkpoint_timeout süresinin dolması
WAL-based (WAL tabanlı)WAL hacminin max_wal_size kaynaklı checkpoint eşiğine ulaşması

Ayrıca manuel CHECKPOINT komutu veya belirli yönetim işlemleri de checkpoint oluşturabilir.

Önemli parametreler:

sql
SHOW checkpoint_timeout; SHOW checkpoint_completion_target; SHOW max_wal_size; SHOW min_wal_size;

Yaygın varsayılan değerler:

ParametreVarsayılan
checkpoint_timeout5min
checkpoint_completion_target0.9
max_wal_size1GB
min_wal_size80MB
full_page_writeson

*Not: Değerler PostgreSQL sürümüne, dağıtıma ve yönetilen servis yapılandırmasına göre değişebilir. Üretim ortamında SHOW çıktısını esas alın.*


4. Checkpoint Spreading Nedir?

Checkpoint işlemleri sırasında çok sayıda dirty page'in kısa sürede diske yazılması disk üzerinde ani I/O yükleri oluşturabilir.

Bu durum özellikle yoğun OLTP sistemlerinde:

  • •Transaction latency artışı
  • •Disk write latency yükselmesi
  • •I/O queue birikmesi
  • •Backend write faaliyetinin artması
  • •Performans dalgalanmaları

gibi sorunlara neden olabilir.

Checkpoint spreading, checkpoint yazma faaliyetinin zamana yayılmasını hedefler.

Bu mekanizma ağırlıklı olarak checkpoint_completion_target parametresiyle yönetilir.

▸4.1 Checkpoint Completion Target

Örneğin:

ini
checkpoint_timeout = '15min' checkpoint_completion_target = 0.9

Bu yapılandırmada PostgreSQL, zaman tabanlı checkpoint aralığının yaklaşık %90'ına yayılacak şekilde checkpoint yazma faaliyetini planlamaya çalışır.

📐 Formül:15 \text{ dakika} \times 0.9 = 13.5 \text{ dakika}

Bu, checkpoint işleminin tam olarak 13.5 dakika süreceği anlamına gelmez. Gerçek süre I/O kapasitesine, dirty buffer miktarına ve WAL üretim hızına bağlıdır.

Checkpoint Spreading Optimization — Bursty checkpoint writes vs Paced checkpoint writes
Checkpoint Spreading Optimization — Bursty checkpoint writes vs Paced checkpoint writes

*Şekil 2 — Aynı toplam yazma yükünün kısa süreye sıkışması ile zamana yayılması arasındaki kavramsal fark. Gerçek checkpoint I/O profili farklı olabilir.*

Checkpoint yazmalarını zamana yaymak ani disk yüklerini azaltmaya yardımcı olabilir. Bununla birlikte yüksek checkpoint_completion_target, tek başına disk darboğazlarını çözmez.


5. WAL, Full Page Writes ve Checkpoint İlişkisi

Bu üç mekanizmanın birlikte değerlendirilmesi PostgreSQL performans optimizasyonunun kritik noktalarından biridir.

Örneğin yoğun yazma yapan bir veritabanında aşağıdaki yapılandırmayı düşünelim:

ini
checkpoint_timeout = '5min' max_wal_size = '1GB' full_page_writes = on

Eğer sistem sık checkpoint oluşturuyorsa, her checkpoint sonrasında değiştirilen veri sayfaları için yeniden FPI kayıtları üretilebilir.

Bu durum WAL hacmini artırabilir.

WAL hacmindeki artış ise max_wal_size kaynaklı checkpoint tetiklenmesini hızlandırabilir.

Böylece iş yüküne bağlı olarak bir geri besleme döngüsü ortaya çıkabilir:

Mimari Akış & Topoloji Şeması (Mermaid)
Mermaid şeması çiziliyor...

Bu nedenle checkpoint optimizasyonu yalnızca checkpoint süresini değiştirmekten ibaret değildir.

Asıl amaç WAL üretim hızı, checkpoint frekansı, dirty buffer miktarı ve disk yazma kapasitesi arasında dengeli bir çalışma modeli oluşturmaktır.


6. WAL Compression ile Full Page Writes Optimizasyonu

PostgreSQL, Full Page Image kayıtlarının boyutunu azaltmak için WAL compression mekanizmasını destekler.

sql
SHOW wal_compression;

Örneğin:

ini
wal_compression = on

Bu ayar, desteklenen varsayılan sıkıştırma yöntemini kullanır. PostgreSQL derlemesinin desteklediği sürümlerde pglz, lz4 ve zstd gibi seçenekler de bulunabilir.

WAL compression özellikle FPI kayıtlarının önemli yer tuttuğu iş yüklerinde WAL hacmini azaltabilir.

Ancak sıkıştırma işlemi CPU tüketimini artırabileceği için toplam performans etkisi ölçülmelidir.

▸6.1 WAL Compression Test Yaklaşımı

Aynı iş yükünü iki farklı yapılandırmada test edebiliriz:

MetrikCompression OffCompression On
WAL bytesÖlçülecekÖlçülecek
FPI countÖlçülecekÖlçülecek
TPSÖlçülecekÖlçülecek
CPU usageÖlçülecekÖlçülecek
Commit latencyÖlçülecekÖlçülecek

Burada dikkat edilmesi gereken nokta, WAL compression'ın FPI sayısını zorunlu olarak azaltmamasıdır. Temel kazanım FPI kayıtlarının kapladığı alanın küçülmesidir.


7. PostgreSQL Üzerinde WAL ve Checkpoint Analizi

Optimizasyona başlamadan önce sistemin mevcut davranışı ölçülmelidir.

▸7.1 WAL İstatistikleri

PostgreSQL 14 ve sonraki sürümlerde pg_stat_wal görünümü kullanılabilir.

sql
SELECT wal_records, wal_fpi, pg_size_pretty(wal_bytes::bigint) AS wal_size, wal_buffers_full, stats_reset FROM pg_stat_wal;

Önemli metrikler:

  • •wal_records: Üretilen WAL kayıtlarının sayısı.
  • •wal_fpi: WAL'a yazılan Full Page Image sayısı.
  • •wal_bytes: Üretilen toplam WAL hacmi.
  • •wal_buffers_full: WAL buffer doluluğu nedeniyle gerçekleşen WAL yazma olaylarının sayısı.

Bu sayaçlar birikimlidir. Dolayısıyla anlık değerler yerine belirli zaman aralıklarındaki farkları incelemek daha anlamlıdır.

▸7.2 Checkpoint İstatistikleri

PostgreSQL 17 ve sonraki sürümlerde:

sql
SELECT num_timed, num_requested, num_done, write_time, sync_time, buffers_written, stats_reset FROM pg_stat_checkpointer;

Burada:

  • •num_timed: Zaman tabanlı planlanan checkpoint sayısı.
  • •num_requested: Talep edilen checkpoint sayısı.
  • •write_time: Checkpoint yazma faaliyetinde geçen toplam süre.
  • •sync_time: Checkpoint senkronizasyon işlemlerinde geçen toplam süre.
  • •buffers_written: Checkpointer tarafından yazılan buffer sayısı.

PostgreSQL 16 ve önceki sürümlerde ilgili checkpoint istatistikleri pg_stat_bgwriter üzerinden takip edilir:

sql
SELECT checkpoints_timed, checkpoints_req, checkpoint_write_time, checkpoint_sync_time, buffers_checkpoint FROM pg_stat_bgwriter;

Sürümler arasında istatistiklerin konumu ve isimleri değiştiğinden izleme sorguları sürüm farkındalığına sahip olmalıdır.

▸7.3 WAL Üretim Hızını Ölçmek

Aşağıdaki sorgu, WAL LSN farkı üzerinden 60 saniyelik yaklaşık üretim hızını hesaplar:

sql
SELECT pg_current_wal_lsn() AS start_lsn \gset SELECT pg_sleep(60); SELECT pg_size_pretty( pg_wal_lsn_diff( pg_current_wal_lsn(), :'start_lsn'::pg_lsn )::bigint ) AS wal_generated;

Bu örnek psql istemcisine özgü \gset komutunu kullanır. Ayrıca sonuç, seçilen örnekleme aralığındaki tüm cluster WAL üretimini yansıtır.


8. Checkpoint Optimizasyonu: Örnek Senaryo

Yoğun yazma yapan bir OLTP veritabanı düşünelim.

▸Sistem Özellikleri:

  • •PostgreSQL 17
  • •64 GB RAM
  • •NVMe SSD
  • •Yoğun INSERT ve UPDATE iş yükü
  • •Physical streaming replication
  • •WAL archiving aktif

Başlangıç yapılandırması:

ini
checkpoint_timeout = '5min' checkpoint_completion_target = 0.9 max_wal_size = '1GB' full_page_writes = on wal_compression = off

İzleme sonucunda aşağıdaki bulguların elde edildiğini varsayalım:

  • •Sık requested checkpoint
  • •Yüksek WAL FPI üretimi
  • •Checkpoint dönemlerinde disk latency artışı
  • •Replikasyon hattında WAL transfer yükünün yükselmesi

Bu durumda ilk değerlendirme, max_wal_size değerinin iş yükü için düşük olabileceği yönünde olacaktır.

▸8.1 Örnek İyileştirme Yapılandırması

Kontrollü test ortamında aşağıdaki ayarlar denenebilir:

ini
checkpoint_timeout = '15min' checkpoint_completion_target = 0.9 max_wal_size = '8GB' min_wal_size = '2GB' full_page_writes = on wal_compression = on

Bu değerler genel geçer optimum ayarlar değildir; yalnızca örnek bir test profilidir.

Olası kazanımlar:

  • •WAL boyutu kaynaklı checkpoint sıklığının azalması.
  • •FPI üretiminde azalma potansiyeli.
  • •WAL compression sayesinde daha düşük WAL hacmi.
  • •Checkpoint I/O yükünün daha dengeli dağıtılması.

Ancak bazı maliyetler de oluşabilir:

  • •Crash recovery sırasında daha fazla WAL işlenmesi gerekebilir.
  • •WAL depolama alanı gereksinimi artabilir.
  • •Sıkıştırma CPU tüketimini artırabilir.
  • •Replikasyon slotları veya arşivleme gecikmeleri nedeniyle WAL disk kullanımı beklenenden fazla olabilir.

Bu nedenle değişiklikler üretime alınmadan önce kapasite ve recovery hedefleriyle birlikte değerlendirilmelidir.


9. Pratik Optimizasyon Hesaplayıcısı

Aşağıdaki hesaplayıcı mantığı, WAL üretim hızına göre belirli bir zaman aralığında üretilecek WAL miktarını tahmin eder. max_wal_size için başlangıç kapasite planlamasında yardımcı olabilir.

ParametreÖrnek DeğerAçıklama
Tahmini WAL Üretim Hızı20 MB/snNormal yazma trafiğinde
Hedef Checkpoint Aralığı15 dakikacheckpoint_timeout
Tahmini WAL Üretimi (Döngü Başına)17.6 GB15 dk × 60 sn × 20 MB/sn
Saatlik WAL Üretimi70.3 GB3600 sn × 20 MB/sn

*Bu hesaplama sabit WAL üretim hızı varsayar. Checkpoint tetikleme mantığı, WAL recycling, replication slots ve archiving nedeniyle gerçek pg_wal disk kullanımı ve checkpoint sıklığı farklı olabilir.*


10. Üretim Sistemleri İçin Optimizasyon Kontrol Listesi

  • PostgreSQL sürümünü ve mevcut WAL ayarlarını doğrula
  • pg_stat_wal sayaçlarını zaman aralıklarında ölç
  • Requested checkpoint oranını değerlendir
  • Disk write latency ve I/O kapasitesini analiz et
  • Full Page Writes korumasını açık tut
  • WAL compression etkisini test et
  • max_wal_size ve checkpoint_timeout değerlerini birlikte değerlendir
  • Replikasyon gecikmesi ve arşivleme durumunu kontrol et
  • Crash recovery süresi ve disk kapasitesi etkisini ölç
  • Değişiklik sonrası TPS, latency ve WAL hacmini karşılaştır

11. Sık Yapılan Hatalar

▸Hata 1 — WAL hacmini azaltmak için Full Page Writes kapatmak

Bu yaklaşım veri bütünlüğü açısından ciddi riskler oluşturabilir. WAL compression ve checkpoint optimizasyonu daha güvenli başlangıç noktalarıdır.

▸Hata 2 — max_wal_size değerini rastgele artırmak

Daha yüksek max_wal_size, WAL kaynaklı checkpoint sıklığını azaltabilir. Ancak recovery süresi ve depolama kapasitesi üzerindeki etkileri de değerlendirilmelidir.

▸Hata 3 — Checkpoint sayısını tek başına performans göstergesi kabul etmek

Checkpoint sayısı önemli olsa da tek başına yeterli değildir. WAL üretim hızı, FPI oranı, write latency, sync time ve transaction latency birlikte incelenmelidir.

▸Hata 4 — WAL compression'ın her durumda performansı artıracağını düşünmek

Sıkıştırma WAL hacmini azaltabilir ancak CPU maliyeti oluşturur. Kazanç iş yüküne ve kullanılan algoritmaya bağlıdır.

▸Hata 5 — max_wal_size değerini kesin disk sınırı sanmak

max_wal_size katı bir disk kotası değildir. Replikasyon slotları, WAL archiving ve diğer gereksinimler nedeniyle pg_wal dizini bu değerin üzerine çıkabilir.


12. Sonuç

PostgreSQL'de WAL, Full Page Writes ve Checkpoint mekanizmaları birlikte çalışarak hem veri bütünlüğünü hem de sistem performansını etkiler.

WAL, değişikliklerin kurtarılabilir olmasını sağlar. Full Page Writes, kısmi sayfa yazımı kaynaklı bozulmalara karşı koruma sunar. Checkpoint ise dirty veri sayfalarının kalıcı depolamaya aktarılmasını ve recovery sürecinin yönetilmesini sağlar.

Ancak bu mekanizmaların yanlış yapılandırılması gereksiz WAL üretimine, ani disk I/O yüklerine ve transaction latency dalgalanmalarına neden olabilir.

Başarılı bir PostgreSQL optimizasyonunun hedefi yalnızca WAL hacmini azaltmak veya checkpoint sayısını düşürmek değildir.

Hedef; veri güvenilirliğini korurken WAL üretimini, checkpoint frekansını, disk I/O davranışını ve recovery maliyetini dengeli biçimde yönetmektir.


Kaynaklar ve İleri Okuma

Makalenin teknik ayrıntılarını doğrulamak ve PostgreSQL sürümlerindeki farklılıkları incelemek için resmi dokümantasyon:

Tartışma & Topluluk Deneyimi

Sizin PostgreSQL ortamınızda shared_buffers değerini artırmak her zaman olumlu sonuç verdi mi?

Özellikle yüksek RAM kapasitesine sahip sistemlerde Linux Page Cache, dirty writeback ve checkpoint davranışları ile ilgili gözlemlediğiniz performans farklılıklarını topluluğumuzla paylaşabilirsiniz.

İlgili Diğer PostgreSQL Derin Mimari Makaleleri
Tüm Mimari Konular