Menü
PostGreSQL 14 Ocak 2026 person Semih

PostgreSQL 18 – postgresql.conf Ayarlamaları 1 – Ubuntu 24.04

PostgreSQL kullananlar bilir, kurduğumuz DB’yi birde Tunning yapmak zorundayızdır. Peki nedir bu Tunning?

Bu ayarlamaları yapmamız aslında PostgreSQL’imizi barındıran sunucumuzun Performansını, Kararlılığını ve Kaynak kullanımını iyileştirmek amacıyla yaparız. Ancak çok kapsamlı bir olaydır ve sunucumuzun donanımından, OS’inden, PSQL ayarlamalarından, Sorgularımızı nasıl yapacağımıza kadar bir çok alanı içerir.

Bu sayede CPU/RAM/DISK kullanımlarını iyileştirmiş oluruz, Sorgularımız hızlı çalışır ve daha Stabil bir PSQL’miz olur. Karmaşık bir olaydır bu ayarlamalar ama yapılmasıda gerekir. Ben bu yazımda ise postgresql.conf dosyasında nasıl ayarlamalar yaparız, yapılan bu ayarlamalar ne işe yarar gibi sorularımıza istinaden yazıyorum.

Ben genelde ilk kurulumlarda sanal makinemin donanım bilgisi ile birlikte buradaki internet sitesine girip bir hesaplama yaptırıyorum belki sizde bunu yaptırmak isteyebilirsiniz. Yardımı dokunabilir sizede.

> psql -h localhost -U postgres -c "SHOW config_file;"

Bu komudu kullanarak conf. Dosyasının nerede olduğunu bulabilir ve nano ile dosyanızın içerisine girebilirsiniz.

Bellek (Memory) Tunning :

shared_buffers : PSQL’in sunucu tarafından ayırdığı ana bellek alanına verilen addır. Diskten okunan veri blokları (pages 8 KB’lık) bu alana alınır ve mümkün olduğunca sorguları buradan çalıştırmaya devam eder, eğer istenen veri bu alanda değilse cache işlemi yapılacak ve buraya alınacaktır. Bu ayar ile birlikte work_mem ve effective_cache_size birlikte değerlendirilmelidir. Sunucunuzda bulunan RAM miktarının %25 kadar verilmelidir, eğer yüksek veriyorsanız, OS cache’de dikkat etmeniz gerekmektedir.

Shared_buffers = 16GB

effective_cache_size : PSQL Query Planner’ına verdiği, toplam erişilebilir cache bu kadardır bilgisi. Bu sayede Planner’da yapacağı işleme karar verirken bu bilgiyi kullanır. Bu alan RAM’den direk olarak ayrılmaz ve kullanılmaz. ÖR : Toplam 64GB’lık bir sunucunuz var, 16GB Shared Buffer’a verdiniz, Diğer servisleriniz ise 4GB kullanıyor, effective_cache_size = 44GB olacaktır. Yani o anda boşta kalabilecek RAM miktarını bu alana yazıyorsunuz ve bu sayede planlamalar yapılıyor.

effective_cache_size = 44GB

OS Cache tarafında ne kadar boş alanım var vs. diye merak ediyorsanız ise aşağıdaki komutları kullanabilirsiniz.

> cat /proc/meminfo
> free -h

Cat kısmında OS Page Cache = Cached + Buffers + Sreclaimable, free kısmında ise available değeri size tahimini bilgiyi verecektir.

work_mem : Sorgu’ların çalıştırılması sırasında ihtiyaç duyulan geçici belleğe verilen addır. Sorgularınızda ORDER BY, GROUP BY, DISTINCT,AGGREGATE, JOIN (Hash Join, Merge Join) gibi Node’lar varsa, Bazen’de CREATE INDEX zamanlarında, her Node başına verilen değer kadar RAM’den kullanılacaktır. Yani birden fazla sorguda, çok fazla node var ise Work_Mem’de 64MB olsun, Node x Work_Mem olacaktır.

Bir sorgu çalıştırıldığında veri work_mem içine sığarsa bilgi RAM’de kalacaktır, Eğer sığmazsa Temporary file kayıtları görünecek şekilde Disk’e yazılacaktır ve buda Performansı çok düşürecektir.

Bu ayar için hesaplamalar yaparken aynı anda çalışan ağır yüklü sorgu node sayısına dikkat edilmelidir. Bunun için sorgularınızı belirledikten sonra onları EXPLAIN (ANALYZE, BUFFERS, VERBOSE) ile çalıştırarak, kullandıkları Memory boyutunuda görebilirsiniz.

ÖR :

> EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM ……

Sorgularınız için geçici olacak şekilde work_mem’de ayarlayabilirsiniz.

> SET work_mem = '256MB';

> EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM ……

work_mem = 32MB

maintenance_work_mem: Bu ayarımızında normal sorguların aksine, bakım (maintenance) işlemlerinin kullanabileceği memory üst sınırını belirleyen parametredir.

VACUUM, VACUUM FULL, ANALYZE, CREATE INDEX, REINDEX gibi işlemlerde kullanılır. Özellikle CREATE INDEX ve REINDEX işlemlerinde etkisi çok büyük olmaktadır.

Küçük sistemlerde 512MB-1GB

Büyük sistemlerde 2GB-8GB arasında olabilmektedir.

Bu ayarla birlikte max_parallel_maintenance_workers ayarına dikkat etmelisiniz. Her bir parallel worker verilen değer kadar RAM yiyecektir. Yani RAM x Parallel worker diyebiliriz.

Bu kısımda da aynı şekilde Set ile Session bazlı olarak değeri artırabilirsiniz (SET maintenance_work_mem = ‘4GB’;) , ancak bu Create index ve Reindex yapacağınız zaman kullanmanız daha verimli olacaktır, aksi halde Vacuum işlemi çokta bu ram’i tüketmemektedir.

maintenance_work_mem = 2GB

WAL (Write-Ahead Log) Tunning :

wal_level : WAL’larınızın hangi ayrıntı seviyesinde tutulacağını belirleyen bu ayar sayesinde replikasyon yapabilir, PITR ve yedeklemelerinizi yapabilirsiniz.

3 farklı değeri bu alana yazabilirsiniz. Bunlar Minimal, Replica ve Logical’dır. Şimdi bunların ne işe yaradığına bakalım.

Replica yapmanız durumunda oluşturulan WAL kayıtlarını, başka bir sunucuda birebir uygulanabilir olmasını sağlayan ayrıntıları içerir.

Bu ayarı Replica yapmanız durumunda ortamınızda; Streaming Replication (Primary,Standby) ortamı oluşturabilir, PITR ve Backup (PgBackRest ve Barman) gibi araçları kullanabilir, pg_basebackup alabilir ve Readonly replica’lar oluşturabilirsiniz.

wal_level = replica

– wal_buffers : WAL kayıtlarının diske yazılmadan önce tutulduğu bellek alanını temsil eden yapılandırma parametresidir. Performans açısından yoğun INSERT, UPDATE, DELETE yapılan sistemlerde önemlidir. Yani Write işlemleri için diyebiliriz.

Diske yazılmayan WAL kayıtlarını, Commit edilmemiş Transaction Log’larını tutan bu alanda Backendler tarafından kullanılırlar.

wal_buffers = -1

Bu şekilde bir ayarlama yaparsanız, shared_buffers’ı base alacak şekilde otomatik ayarlanmasını sağlamış olursunuz. Yazma işlemi yoğun olan sistemlerde bu ayarı manuel olarak ayarlayıp biraz büyütmekte yarar olabilir.

– fsync : Bir system call olan bu çağrı bilginin diske yazıldığını garanti eder. Bir dosyaya yazılmış olan verinin sadece OS Cache’de değil, Fiziksel olarak diskin üzerine de yazarak, kalıcı hale getirir. Bu sayede sistem çökse, ram’den okunmayacak ve diske yazılmayacak veriyi zorlayarak yazdığı için bu risk durumunu ortadan kaldırır. Değer olarak on ve off yapabilirsiniz. Tahmin edersiniz ki on olması hepimiz için daha iyi olacaktır. 🙂

Performans açısından düşünürsek DB gibi sistemlerin olduğu yerde SSD ya da NVMe gibi alanlarınız olması bu işlemi hızlandırır. Yani HDD türünüz hızı etkileyen faktör olacaktır.

fsync = on

synchronous_commit : Bir Transaction Commit edildiğinde, WAL kayıtları diske gerçekten yazıldığında mı? Yoksa yazılmadan mı Client’a başarılı cevabını dönecek sorusunu yanıtlar.

on : Yapmanız durumunda WAL diske fsync edilene kadar bekler ve COMMIT OK cevabını döner.
off : fsync beklemeden COMMIT OK döner, ancak burada WAL diske yazılmamış olabilir.
local : Standby onayı beklenmeden WAL disk’e Flush edilir.
remote_write : Replication ortamınızda, Primary WAL gönderir, Standy WAL’ı yazar ama fsync etmeden bunu yapar.
remote_flush : Standby tarafı WAL’ları fsync eder.
remote_apply : COMMIT OK denebilmesi için, Standby tarafından WAL alınır, Disk’e yazılır, Replay eder sonrasında COMMIT başarılı sayılır.

checkpoint_timeout : İki checkpoint arasındaki maksimum süreyi belirler. Bu süre dolduğu an psql checkpoint işlemini başlatır. Checkpoint’i tetikleyen başka durumlarda vardır; Timeout bunlardan biridir, WAL segmentleri dolunca da, manuel olarakta tetikleyebiliriz.

checkpoint_timeout = 10min

checkpoint_completion_target : Checkpoint_Timeout’una verilen değeri, checkpoint sırasında nasıl kullanacağını belirleyen parametredir. ÖR : timeout 10min, target değerini 0.9 verdiniz. 9 dakikaya yayacak şekilde checkpoint yapacak, son 1 dk boşta kalacaktır.

checkpoint_completion_target = 0.9

max_wal_size : Checkpoint’ler arasında tutulacak olan Wal’ların, maksimum toplam boyutunu belirler. Bu değer aşıldığında PSQL zorunlu bir checkpoint başlatır. Yani aslında bu parametre de Checkpoint’in ne zaman tetikleneceğini dolaylı yoldan kontrol etmiş olur. min_wal_size ile birlikte çalışır bundan dolayı ikisine birden değer vermeniz iyi olacaktır.

min_wal_size = 80MB
max_wal_size = 8GB

Evet arkadaşlar bu dosyayı açıklamaya kalksak çok satır olacağı için biraz bölerek yazacağım. İlk kısım bu şekilde olsun.

Umarım işinize yarayan bir içerik olmuştur. Bana destek vermek isterseniz Sosyal Medya kanallarımdan beni takip edebilirsiniz. Arada sırada olsa da reklamlarıma da bi tık atabilirsiniz. 🙂 Herkese kolay gelsin.

edit_note Bir Yorum Bırakın