PostgreSQL 18 – postgresql.conf Ayarlamaları 2 – Ubuntu 24.04
Şimdi Tunning ile ilgili bir sonraki yazıma hoşgeldiniz diyerek başlayayım. Config dosyasında çok fazla ayar olduğu için bu yazımda size kendi sistemlerimde de ayarlamalarını yaptığım parametreleri açıklamaya çalışacağım. Hemen başlayalım. Buraya tıklayarak ilk yazımı da okuyabilirsiniz.
Bu yazımda şunuda söylemek istiyorum. Bir parametrenin yanında # (change requires restart) yazısını görürseniz, ayarlama yaptıktan sonra PSQL’e Restart atmanız gerektiği anlamına gelir.
– listen_addresses : Psql sunucusu bağlantıları kabul edebilmek için bir IP’yi dinlemede olması gerekiyor bu ayar ile onu belirtiyoruz. Tabi burada ayar yapmak tek başına yeterli olmuyor psql’e erişmek için ilerleyen yazılarda onada değineceğim.
listen_addresses = '*'
Bu alana verebileceğiniz değerlere gelince, ‘ ‘ boş bırakırsanız tamamen kapatmış olursunuz, * ile tanımlama yaparsanız herkese izin vermiş olursunuz. ‘localhost’ yazarsanız sadece local erişim, ‘localhost,192.168.1.15’ ise , ile birden çok ip yazabilirsiniz.
Değerleri ise direk PSQL içerisinden kontrol etmek isterseniz aşağıdaki komutta SHOW kısmı kalacak şekilde değiştirerek yapabilirsiniz.
> SHOW listen_addresses;
– port : Psql sunucusuna bağlantı sağlarken dinlenecek olan portu belirlediğimiz alandır. Varsayılan değerininde zaten 5432 olduğunu biliyorsunuz.
port = 5432
– max_connections : Ayarımız ise aynı anda kabul edebileceği eşzamanlı maksimum bağlantı sayısını belirleyebildiğimiz parametredir. Burada bağlanan her bir kullanıcı OS seviyesinde ayrı bir backend process oluşturarak bağlantı sağlar. Buna da Process–per–connection modeli denir. Yani her bir bağlantı 1 Process’dir.
max_connections = 100
– superuser_reserved_connections : Normal kullanıcıların tüm bağlantı limitini tüketmesi durumunda, Superuser kullanıcıları için max_connections ayarından düşürülerek ayrılan değerdir. 100-3 şeklinde düşünebilirsiniz. Herhangi bir aksilik olması durumunda superuser’ların giriş yapmasını sağlar. Bu değeri yüksek vermeden %5’e kadar max_connections değerinden ayırabilirsiniz.
superuser_reserved_connections = 3
– default_statistics_target : Bu parametreye verilen değer ile, Query Planner için topladığı istatistiklerin ayrıntı seviyesini belirleyen temel bir parametredir. Plan kalitesini artırmayı amaçlayan parametredir. Default değeri 100’dür ve ANALYZE çalıştığı zaman istatistik seviyesini belirler.
default_statistics_target = 100
100 ve ya 1000 değerini vermeniz durumunda özetleri verilen değerlere göre parçalar ve detaylı bir özetle kolonları tanır.
– effective_io_concurrency : Diskten veri okurken aynı anda kaç I/O isteğini paralel olarak gönderebileceğini planner’a söyleyen bir parametredir. Buraya verdiğiniz değer ile Disk’in paralel I/O kapasitesini tanımlamış olursunuz. Bitmap Heap Scan, Index Scan ve Büyük tablo okuma gibi durumların plan aşamasında kullanılır. Değer büyüdükçe planner daha agresif davranacaktır. SSD sistemlerinizin üzerinde kurulu olan DB’leriniz için 16 – 32 en ideal aralıktır.
effective_io_concurrency = 32
– hot_standby_feedback : PSQL ortamınızda Replikasyon varsa ve Standby tarafında uzun süren sorgularınız devam ederken, Primary tarafında yapılan VACUUM sırasında bu sorgu bilgilerinin silinmemesini sağlayan bir parametredir.
Yani Standby sunucunuzda olan Select (Sorgu) işlemlerinde Primary tarafa ben bu satırları okuyorum bunları silme mesajını verir. Bu sayede sorun oluşmayacaktır ama VACUUM işlemi bu dead tuple’ları silemeyecek, haliyle de tablolarınız şişecektir. Standby tarafındaki sorgularınızı buna göre kurgulamanız gerekecektir. Varsayılan olarak off durumdadır.
hot_standby_feedback = on
– random_page_cost : Query Planner’ın Disk türüne göre Index Scan mı, Sequential Scan mı yapacağını planlamasını sağlayan değerdir. Varsayılan olarak değeri 4.0’dır. Siz bu değeri varsayılanda bırakırsanız Sequential Scan daha maliyetsiz gelecek ve onu planlayacaktır, Ancak yüksek bırakırsanız yani 1.1 gibi bir değer, Random I/O daha ucuz diyecektir ve Index Scan yapılacaktır. HDD’yi düşünerek varsayılan olarak değeri 4.0’da bırakılmıştır.
random_page_cost = 4.0
– max_wal_size : Bu ayarla birlikte Checkpoint’lerin ne zaman tetikleneceğini dolaylı yoldan belirlemiş oluruz. Burada yapılacak olan ayar wal’ların max tutulacağı değer anlamına gelmez, çünkü bazı durumlarda; Çok fazla write işlemi var ise, Replikasyon geçikmesi oluşmuşsa, Archive yavaşlığı var ise tutulan WAL dosyaları bu değerin üzerine çıkacaktır. Yani bu ayar ile verilen değer kadar wal tut ve sonrasında checkpoint yap deriz. Birde min_wal_size vardır oda en az tutulacak olan wal sayısını belirtir. Genelde ikisini birlikte düşünürüz.
min_wal_size = 80MB
max_wal_size = 1GB
– checkpoint_timeout : Zaman bazlı olarak checkpoint eşiğini belirleyen parametredir. Max_wal_size ile birlikte çalışan ayrı bir parametredir. Wal dolunca da checkpoint çalışır, aslında hangisi dolarsa o zaman checkpoint tetiklenecektir.
checkpoint_timeout = 5min
– wal_keep_size : Bu ayar ile replikasyon olan bir ortamda, standby sunucusunun geri kalması durumunda boyut olarak en az saklanacak wal boyutunu belirtmemizi sağlar. Bende çok yüksek boyutlarda olan db’lerde Standby tarafını kurduğum zaman bu değeri yüksek tutuyorum ki eski wal dosyalarını silmesin bu sayede Standby tarafını ayağa kaldırabileyim. Aslında bunu Replikasyonu bağladığınız slot ile de yapabiliyorsunuz ama nedense bana bu daha güvenli geliyor, boyutu çok veriyorum ve o kadar dosya replikasyonu kurana kadar disk’te bekletiliyor. Sonrasında replikasyonu ayağa kaldırıyorum ve checkpoint; tetikleyerek birikmiş wal’ları siliyorum.
Burada wal_keep_size sadece wal tutar kaç tane standby var bilmez ama ortamınızda Replication koptuğu zaman zaten wal’lar karşıya iletilemediği için yine de saklanmaya devam edecek.
wal_keep_size = 1GB
– max_replication_slots : Replikasyonlarınız için slot oluştururken, toplam kaç adet slot tanımlayabileceğinizi belirtiğiniz parametredir. Physical Streaming Replication ve Logical Replication slot adetidir. Burada değeri yüksek verip çok fazla slot oluşturabilirsiniz ancak bu slotlarla işiniz bittikten sonra silmeyi unutmayın arkadaşlar. Ben bu konuyla alakalı deneyimimi PSQL13 to 18 Upgrade işlemi yaparken deneyimledim. Allahtan çok kötü bir olay olmadı ama replication’larımı kaybetmiştim onlarıda tekrar oturtabiliyorsunuz zaten. Unutulan slotlar wal tutar, bundan dolayı disk boyutunu aşırı artırabilir ya da VACUUM engelleyebilir dikkatli olmakta yarar var.
max_replication_slots = 10
– max_wal_senders : Bu parametre ile ise postgresql Primary sunucusuna aynı anda kaç replikasyon bağlantısı yapılabilir sayısını belirttiğimiz parametredir. Yani wal sender process çalıştırabilir verilen değer kadar.
max_wal_senders = 5
– max_parallel_workers : Aynı anda Maximum çalışabilecek Paralel Worker Process sayısını belirlediğimiz parametredir. Kullanım alanlarından örnekler vermem gerekirse; Parallel Seq Scan, Parallel Hash Join vb.’dir. CPU Core sayısına göre hesaplanmalıdır.
max_parallel_workers = 8
– max_parallel_workers_per_gather : Tek bir sorgunun ne kadar paralel olabileceğini sınırlayan parametredir. Buraya verilen değer ile bir sorguda ancak o kadar worker çalışabilir.
max_parallel_workers_per_gather = 4
– max_parallel_maintenance_workers : PostgreSQL Maintenance yani bakım işlemlerinde (REINDEX, VACUUM vb.), aynı anda kullanabileceği paralel worker sayısını belirlediğimiz parametredir.
max_parallel_maintenance_workers = 4
– max_worker_processes : Arka planda aynı anda çalışabilecek process sayısını ortak bir alandan sınırlayan ayarımızdır. Paralel sorgular (max_parallel_workers), bakım işlemleri (max_parallel_maintenance_workers), logical replication worker’ları ve bazı background process’leri ortaklaşa burayı kullanırlar. Bu parametreyi düzenlerken bu max_parallel_maintenance_workers + max_parallel_workers + ekstra worker = max_worker_processes. Bu bir tavan değerdir de diyebiliriz. Örnek aşağıdaki gibidir.
max_worker_processes = 20
max_parallel_workers = 12
max_parallel_maintenance_workers = 4
– max_logical_replication_workers : Bu parametremiz ile de aynı anda kaç logical replication process’i çalıştırılabilir sınırlamasını yapmış oluyoruz. Ancak şöyle ki ilk logical replication bağlantısı kurduğunuzda birden fazla slot ile DB sync etmeye çalışacaktır ve bazen bu durumdan da yetmeyebilir bu slot.
max_logical_replication_workers = 4
– max_sync_workers_per_subscription : İşte bu kısımda da karşımıza bu parametre çıkmaktadır. Tek bir subscription’ın tabloları senkronize ederken kullanabileceği slot sayısını belirler.
max_sync_workers_per_subscription = 2
– wal_log_hints : Veri sayfalarında yapılan hint bit değişikliklerini de WAL’a yazıp, yazmayacağını belirleyen parametredir. Replication ortamlarda ON olması önerilir.
wal_log_hints = on
– wal_receiver_status_interval : Replication ortamlarınızda Standby tarafından Primary’e gönderilen WAL durumu, Durum güncellemesi ve yaşıyorum deme sıklığıdır.
wal_receiver_status_interval = 10s
PSQL için ayarlamalar çok arkadaşlar elimden geldiğince kullandığım ayarları hatta bunları kontrol ederken yenilerini de ekleyerek birkaç parametre daha yazdım. Buda ikinci yazım olsun biraz daha genişletebilirsem bu yazıyı yapacağım ama kendi sistemlerimde de kullandığım parametrelere dayanarak böyle bir şey yazmak istedim. Umarım yararlı olmuştur.
Bana destek vermek isterseniz Sosyal Medya kanallarımdan beni takip edebilirsiniz. Kolaylıklar dilerim.