Konfigurasyon dosyası temel olarak instance’ın davranışını etkiler, örneğin izin verilen bağlantı sayısı, veritabanı log yönetimi, vaccum, wal parametrelerini belirleme vb. Elbette tüm bunlar, veritabanı kurulduğunda varsayılan bir değere sahiptir, ancak bu değerleri iş yükünü ve çalışma ortamını daha iyi yansıtacak şekilde değiştirebiliriz.

Bu parametreleri ayarlamanın en temel yolu, normalde $PGDATA dizininde tutulan postgresql.conf dosyasını düzenlemektir, postgresql.conf dosyası init aşamasında varsayılan olarak kopyası yüklenir. Eğer postgresql.conf dosyasının tam yolunu komut kullanarak bulmak istersek aşağıdaki komutu kullanıyoruz.

select * from pg_settings where name='config_file';

Örnek bir postgresql.conf dosyası aşağıdaki gibidir, tahmin edileceği üzere her satıra bir parametre belirtilir,  name ve value arasındaki eşittir işareti opsiyoneldir. boşluklar önemsiz, # işareti ise satırın geri kalanını yorum olarak belirler.

Postgresql Parameter

NOT : posgresql.conf dosyasında aynı parametre için birden çok girdi içeriyorsa, sonuncusu hariç tümü yok sayılır, yani dosyada en son yazar değer geçerli olur.

Bu şekilde ayarlanan parametreler, cluster için varsayılan değerleri sağlar, aktif sessionlar tarafından görülen ayarlar, geçersiz kılınmadıkları sürece bu değerler olacaktır.

Postgresql main prosesi SIGHUP sinyalini aldığı zaman Postgresql konfigürasyon dosyası yeniden okunur. Bu sinyal postgresql’e iki yolla gönderilebilir. İşletim sistemi üzerinde postgres kulanıcısı ile “pg_ctl reload” komutu ile veya psql komut satırı aracından “SELECT pg_reload_conf()” komutu ile postgresql.conf dosyasının tekrar okunması sağlanır. Main prosesi ayrıca bu sinyali şu anda çalışan tüm sunucu proseslerine yayar, böylece mevcut sessionlar da yeni değerleri benimser (bu, o anda yürütülen herhangi bir client komutunu tamamladıktan sonra gerçekleşir). Alternatif olarak, sinyali doğrudan tek bir sunucu işlemine gönderebilirsiniz.  Konfigurasyon dosyasındaki geçersiz parametre ayarları benzer şekilde SIGHUP işlemi sırasında göz ardı edilir (ancak loga kaydedilir).

-bash-4.2$ /usr/pgsql-12/bin/pg_ctl reload
server signaled
-bash-4.2$ psql
psql (12.4)
Type "help" for help.

postgres=# select pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)

Bazı parametreler yalnızca sunucu başlangıcında ayarlanabilir; bu parametreleri için postgresql.conf dosyasının yorum kısmında “# (change requires restart)” yazar.

Postgresql.conf’a ek olarak, postgresql.conf ile aynı biçime sahip olan ancak manuel olarak değil, otomatik olarak düzenlenmesi amaçlanan bir postgresql.auto.conf dosyası içerir. Bu dosya, ALTER SYSTEM komutu ile sağlanan ayarları içerir. postgresql.auto.conf içindeki ayarlar postgresql.conf içindekileri geçersiz kılar. postgresql.auto.conf dosyasıda $PGDATA dizininde bulunur.

NOT : Pg_settings system viewi, sunucunun çalışma zamanı parametrelerine erişim sağlar. Esasen SHOW ve SET komutlarına alternatif bir arayüzdür. Ayrıca, minimum ve maksimum değerler gibi, SHOW’da doğrudan bulunmayan her parametre hakkında bazı gerçeklere erişim sağlar.

 select * from setting where name  = 'configuration_parameter';
UPDATE pg_settings SET setting = reset_val WHERE name = 'configuration_parameter';

Parametrelerin SQL ile Değiştirilmesi

PostgreSQL, parametreleri düzenlemek için üç SQL komutu sağlar.

  • ALTER SYSTEM : Cluster seviyesindeki parameterleri değiştirmek için kullanılır, postgresql.conf’u düzenlemeye eşdeğerdir. Bu parametre ile yapılan değişiklerin postgresql.auto.conf dosyasına yazıldığını söylemiştik. Örnekler;
ALTER SYSTEM SET wal_level = replica;
ALTER DATABASE test SET timezone = 'UTC-5';
ALTER SYSTEM RESET wal_level;
ALTER SYSTEM RESET ALL; 
  • ALTER DATABASE : Global parametrelerin veri tabanı bazında override edilmesi sağlanır. Örnekler;
 ALTER DATABASE db_test SET escape_string_warning = off;
ALTER DATABASE db_test SET enable_indexscan TO off;
ALTER DATABASE test SET timezone = 'UTC-5';
ALTER DATABASE db_test RESET escape_string_warning;
ALTER DATABASE db_test RESET ALL;
  • ALTER ROLE : Kullanıcıya özel parametre geçilmesini sağlar. Örnekler;
 ALTER ROLE test_user SET client_min_messages  = DEBUG;
ALTER ROLE test_user SET maintenance_work_mem = 100000;
ALTER ROLE test_user IN DATABASE test_db SET maintenance_work_mem = 100000;
ALTER USER test_user IN DATABASE test_db RESET maintenance_work_mem;
ALTER USER test_user IN DATABASE test_db RESET ALL;
ALTER USER test_user IN DATABASE test_db SET timezone = 'UTC-7';

ALTER DATABASE ve ALTER ROLE ile ayarlanan değerler yalnızca yeni veritabanı session başlatılırken uygulanır. Konfigurasyon dosyalarından veya sunucu komut satırından elde edilen değerleri geçersiz kılarlar ve oturumun geri kalanı için varsayılanları oluştururlar. Her parametre veri tabanı ve session bazında uygulanamaz. Dolayısıyla bazı parametreler için ALTER DATABASE ve ALTER ROLE komutları kullanılamaz.

Bir client veritabanına bağlandığında, PostgreSQL, session-locak yapılandırma ayarlarıyla etkileşim kurmak için iki ek SQL komutu (ve eşdeğer fonksiyon) sağlar:

  • SHOW komutu, tüm parametrelerin mevcut değerinin incelenmesine izin verir. Karşılık gelen fonksiyon current_setting’dir.
SHOW ALL;
SHOW DateStyle;
select current_setting('datestyle'); 
  • SET komutu, local olarak bir sessiona ayarlanabilen bu parametrelerin mevcut değerinin değiştirilmesine izin verir; diğer seanslar üzerinde etkisi yoktur. Karşılık gelen fonksiyon set_config’dir.
 SET search_path TO my_schema, public;
SET datestyle TO postgres, dm
SET TIME ZONE 'PST8PDT';
SET TIME ZONE 'Europe/Rome';
select set_config('log_statement_stats', 'off', false);

PostgreSQL, karmaşık postgresql.conf dosyalarını alt dosyalara ayırmak için çeşitli özellikler sağlar. Bu özellikler, özellikle birbiriyle ilişkili ancak aynı olmayan yapılandırmalara sahip birden çok sunucuyu yönetirken kullanışlıdır.

 include 'shared.conf'
include 'memory.conf'
include 'server.conf'

Postgresql.conf dosyasında çok fazla parametre olduğu için dosya sınıflandırma amacı ile belirli başlıklara/konulara bölünmüştür; File Locations, Resource Consumption, Connections ve Authentication vb gibi başlıklar mevcut. Yazının bu kısmından sonra postgresql’deki önemli parametreleri kısaca açıklayıp, kendimce(özellikle perfomans ile ilgili paramtrelerde farklı tartışmalar mevcut olduğu için herkesi doğrusu kendine gibi bir durum söz konusu J) bu parametrelerin ayarı ile ilgili tavsiyelerde bulunacağım.

Bağlantılar (Connections)

  • listen_addresses (string) : Sunucunun client uygulamalarından gelen bağlantıları dinleyeceği TCP/IP adresini/adreslerini belirtir. Birden çok adres belirteceksek virgül(,) ile ayırarak hostname ve ip numaralarını verebiliriz.* mevcut tüm IP interfacelerine karşılık gelir, 0.0.0 girişi tüm IPv4 adreslerini dinlemeye izin verir, :: ise tüm IPv6 adreslerini dinlemeye izin verir. Liste boşsa, sunucu herhangi bir IP interface’i hiç dinlemez, bu durumda ona bağlanmak için sadece Unix domain soketleri kullanılabilir. Varsayılan değer, yalnızca local TCP/IP “loopback” bağlantılarının yapılmasına izin veren localhost’tur.
  • port (integer) : Postgresql default olarak 5432 portundan hizmet verir. Server tarafından dinlenilen bütün IP adresleri aynı port üzerinden hizmet verir. Genelde birden fazla postgresql instance kullanıldığında her instance için farklı port
  • max_connections (integer) : Veri tabanında aynı anda açılabilecek maksimum connection sayısını belirtmek için kullanılır. Defaul olarak değeri 100’dür. Standby sunucularda bu parametre master server’daki parametre değeri ile aynı veya daha yüksek set edilmelidir.

ÖNERİ ; Bağlantı sayınızı artırmadan önce; gerçekten artırılmış bir bağlantı sınırına ihtiyacımız olup olmadığını düşünmeliyiz, sonuçda makinemizde sınırlı miktarda RAM var. Daha fazla bağlantıya izin verirseniz, her bağlantıya daha az RAM ayırabilirsiniz. Aksi takdirde, swap kullanımı tehlikesiyle karşı karşıya kalırsınız. Sorgu çalışma sırasında her işlem için kullanılabilen private memory work_mem ile sınırlıdır. Dolayısıyla, max_connections için yüksek bir değer kullanırsanız bu parametreyi düşük olarak ayarlamanız gerekecektir. work_mem’in sorgu performansı üzerinde doğrudan bir etkisi vardır yani kısaca kaş yapayım derken göz çıkarmak diyebiliriz J. Zaten genellikle iyi yazılmış bir uygulama çok sayıda bağlantıya ihtiyaç duymaz.  Çok sayıda bağlantıya ihtiyaç duyan bir uygulamanız varsa, pg_bouncer gibi sizin için bağlantıları bir araya toplayabilen bir araç kullanmayı düşünmeliyiz.

  • superuser_reserved_connections (integer) : max_connections parametresi ile belirlenen bağlantı sayısından kaç tanesinin super user rolündeki kullanıcılar için ayrılacağını belirler. Default olarak 3’tür. Max_connections parametresinin 100 superuser_reserved_connections parametresinin ise 3 olarak set edildiği durumda normal kullanıcılar sistem üzerinde maksimum 97 bağlantı açabilir.

ÖNERİ ; Burada dikkat edilmesi gereken nokta varsayılan olarak super kullanıcı olarak gelen postgres kullanıcısının uygulamada kullanılmıyor olmasıdır. Yani uygulamamızda postgres kullanıcısını kullanırsak bu parametrenin hiçbir anlamı olmaz.

  • tcp_keepalives_idle (integer) : İşletim sistemi ve client arasında herhangi bir newtwork aktivietsi olmayan bağlantılır için süre sınırı belirler. Bu değer birimsiz belirtilirse saniye olarak alınır. 0 değeri (varsayılan), işletim sisteminin varsayılanını seçer.
  • tcp_keepalives_interval (integer) : Client tarafından kabul edilmeyen TCP keepalive mesajının ne kadar süre sonra yeniden iletileceğini belirtir. Bu değer birimsiz belirtilirse saniye olarak alınır. 0 değeri (varsayılan), işletim sisteminin varsayılanını seçer.
  • tcp_keepalives_count (integer) : Sunucunun client ile bağlantısı kesik olarak kabul edilmeden önce kaybedilebilecek TCP keepalive mesajlarının sayısını belirtir. 0 değeri (varsayılan), işletim sisteminin varsayılanını seçer.
  • tcp_user_timeout (integer) : TCP bağlantısı zorla kapatılmadan önce iletilen verilerin onaylanmadan kalabileceği süreyi belirtir. Bu değer birimsiz belirtilirse milisaniye olarak alınır. 0 değeri (varsayılan), işletim sisteminin varsayılanını seçer.

Kimlik Denetleme (Authentication)

  • authentication_timeout (integer) : Kullanıcının veri tabanına bağlantı işleminin beklenilen sürede tamamlanaması durumunda bağlantı talebinin reddedilmesini sağlayan parametredir. Saniye cinsinden set edilir ve default değeri 1 dakikadır.
  • password_encryption (enum) : CREATE ROLE veya ALTER ROLE’da bir parola belirtildiğinde, bu parametre parolayı şifrelemek için kullanılacak algoritmayı belirler. Default olarak md5’tir.
  • db_user_namespace (boolean) : Veri tabanlarında birbirinden bağımsız user’lar oluşturmak için kullanılır. Default değeri off’tur. Değeri on olur ise username@dbname söz dizimi ile bir veri tabanına özel kullanıcı yaratılabilir.
  • ssl (boolean) : SSL bağlantı yöntemini aktif hale getiren parametredir. Default olarak değeri off’tur.

ÖNERİ : SSL sertifikası kullanmak, bağlantımızı şifrelediği için araya girebilecek kötü niyetli kişilerin paketlerimizi dinlemek istediğinde şifrelenmiş bir mesajla karşılaşmasını sağlıyor. Bu sayede paketimizde taşıdığımız bağlantı bilgilerimiz güvende oluyor.

  • ssl_ca_file : SSL sunucu certificate authority (CA) içeren dosyanın adını belirtir. Varsayılan boştur, yani CA dosyası yüklenmez ve istemci sertifikası doğrulaması yapılmaz.

Kaynak Tüketimi (Resource Consumption)

  • shared_buffers : Memory’de shared buffer olarak kullanılacak alanın ayarlanmasını sağlayan parametredir. Default olarak 128 MB’tır.1 GB veya daha fazla RAM içeren veritabanına özel bir sunucunuz varsa, shared_buffers için makul  başlangıç ​​değeri, sisteminizdeki belleğin %25’idir. Shared_buffers için daha da büyük ayarların etkili olduğu  iş yükleri vardır, ancak PostgreSQL aynı zamanda işletim sistemi cache yapısına dayandığından, RAM’in% 40’ından fazlasının shared_buffers’a tahsis edilmesi daha küçük bir shared_buffers’dan daha iyi çalışmayacaktır.  Shared_buffers için daha büyük ayarlar, büyük miktarlarda yeni veya değiştirilmiş veri yazma sürecini daha uzun bir süreye yaymak için genellikle max_wal_size değerindede karşılık gelen bir artış gerektirir.

ÖNERİ : Önemli olduğu için tekrardan yazmak istedim; PostgreSQL kendi buffer alanının yanında işletim sistemindeki kernel buffer alanınıda kullanır, yani shared_buffers’dan atılan veri işletim sistemi cache’ne düşer ve ihtiyaç halinde postgresql işletim sistemi cache’inden alır. Bu, verilerin bellekte iki kez, önce PostgreSQL buffer ve sonra kernel buffer’da depolandığı anlamına gelir(Diğer veritabanlarının aksine, PostgreSQL doğrudan IO sağlamaz), buna double buffering denir. Bu kısmı vurguladıktan sonra öneriye gelecek olursak Shared_buffer’ın varsayılan değeri çok düşük bir değere ayarlanmıştır ve bundan pek bir fayda elde edemezsiniz. Düşüktür çünkü bazı makineler ve işletim sistemleri daha yüksek değerleri desteklemez. Ancak çoğu modern makinede, optimum performans için bu değeri artırmanız gerekir. Önerilen değer, toplam makine RAM’inizin% 25’idir. Daha düşük ve daha yüksek değerler denemelisiniz çünkü bazı durumlarda% 25’in üzerinde bir ayar ile iyi performans elde ederiz. Yapılandırma gerçekten makinenize ve çalışma veri setine bağlıdır.

  • huge_pages (enum) : shared memory alanında huge pages kullanımı seçeneklerini ayarlamayı sağlayan parametredir. Try, on veya off değeri alabilir. Default olarak Try’dır. Kullanmayı dener kullanamaz ise sistem çalışmasında herhangi bir sıkıntı oluşmaz. On olarak set edildiğinde kullanamaz ise veri tabanı başlatılamaz. Off olarak set edildiğinde ise hiç kullanılmaz.

ÖNERİ : huge pages kullanımı, küçük tablo pageleri ve bellek yönetimi için daha az CPU zamanı harcanmasına neden olarak performansı artırır, bu nedenle işletim sisteminde gerekli ayarları yapıp kullanılmasını öneririm.

  • temp_buffers (integer) : Her bir session için kullanılacak maksimum temporary buffer alanın değerini belirleyen parametredir.Bunlar, yalnızca temporary tablolara erişim için kullanılan sessiona özel buffer alanıdır. Default değeri 8MB’tır.
  • work_mem (integer) : Geçici disk dosyalarına yazmadan önce bir sorgu işlemi (sıralama veya hash table gibi) tarafından kullanılacak temel maksimum bellek miktarını ayarlar. Varsayılan değer dört megabayttır (4MB). Sıralama işlemleri ORDER BY, DISTINCT ve merge join için kullanılır. Hash tablolar, hash joins, hash-based aggregation, hash-based processing ve IN subquerylerin işlenmesinde kullanılır. Birkaç aktif oturum bu tür işlemleri aynı anda yapıyor olabilir. Bu nedenle, kullanılan toplam bellek, work_mem değerinin birçok katı olabilir; Değeri seçerken bu gerçeği akılda tutmak gerekir.

ÖNERİ : Memory’deki sıralamalar, disktekilere çok daha hızlıdır fakat çok yüksek bir değer ayarlamak, bu parametre kullanıcı sıralama işlemi başına olduğundan, prod ortamınız için bir bellek darboğazına neden olabilir. Bu nedenle, sıralama işlemlerini yürütmeye çalışan çok sayıda kullanıcınız varsa, sistem tüm kullanıcılar için work_mem * toplam sıralama işlemlerini tahsis edecektir. Bu parametrenin genel olarak ayarlanması çok yüksek bellek kullanımına neden olabilir. Bu nedenle, bunu session düzeyinde değiştirmeniz şiddetle tavsiye edilir.

Diğer bir yaklaşımdandanda bahsetmek istiyorum; work_mem değerini tespit etmek için aşağıdaki formulü kullanılması öneriliyor. Eğer bir connection pooling aracı kullanılıyor ve max connection sayısı belirlenebiliyorsa bu formülün kullanılmasıda mantıklı gelebilir.

Total RAM * 0.25 / max_connections

NOT : Ayrıca work_mem’i bir role doğrudan atayabiliriz;

alter user test set work_mem='4GB'; 
  • maintenance_work_mem (integer) : VACUUM, CREATE INDEX ve ALTER TABLE ADD FOREIGN KEY gibi bakım işlemleri tarafından kullanılacak maksimum bellek miktarını belirtir. Varsayılan olarak 64 megabayttır (64MB). Bu işlemlerden yalnızca biri bir session tarafından aynı anda yürütülebildiği için ve normal kurulumda çoğu eşzamanlı olarak çalışmadığından, bu değeri work_mem’den çok daha büyük bir değere ayarlamak güvenlidir.
  • temp_file_limit : Her proses tarafından kullanılan tüm geçici dosyaların toplam boyutunu sınırlar. -1 (varsayılan) sınır yok demektir.

ÖNERİ : Veritabanı proseslerini izleyerek, bu değerin girilmesinin faydalı olduğunu düşünüyorum örnek vermek gerekirse uygulamadan yanlışlıkla gelen 100 milyarlık bir sort işleminden dolayı diskin dolduğuna şahit oldum.

  • bgwriter_delay (integer) : Background writer prosesinin ardışık çalışmaları arasında ne kadar beklemesi gerektiğini belirtir.

ÖNERİ : Bu paramtre istenildiğinde düşürülebilir ama benim genel yaklaşımım bgwriter ile ilgili parametreleri, chechkpoint artışlarıyla veya pg_stat_bgwriter’ı izleyerek gösterilen bir sorunla karşılaşıyorsanız değiştirmenizi tavsiye ederim.

  • bgwriter_lru_maxpages (integer) : bgwiter’ın her bir çalışmasında işlem tarafından yazılacak maksimum buffer sayısını belirtir.
  • bgwriter_lru_multiplier (floating point) : Her turda yazılan dirty bufferların sayısı, son turlarda sunucu işlemleri tarafından ihtiyaç duyulan yeni bufferların sayısına bağlıdır. Ortalama son ihtiyaç, bir sonraki turda ihtiyaç duyulacak buffer sayısının tahminine ulaşmak için bgwriter_lru_multiplier ile çarpılır. Yani bu değeri 3.0 ayarlarsak her seferinde yazabileceği dirty buffer sayısı bgwriter_lru_maxpages*3 olacak. Varsayılan olarak bu değer 2.0’dir.
  • effective_io_concurrency (integer) : PostgreSQL’in eşzamanlı olarak yürütülebilmesini beklediği eşzamanlı disk I/O işlemlerinin sayısını ayarlar. Bu değerin yükseltilmesi, herhangi bir PostgreSQL oturumunun paralel olarak başlatmaya çalıştığı I/O işlemlerinin sayısını artıracaktır. Varsayılan değer 1’dir, disable yapmak için 0 değerini kullanabiliriz, aynı zamanda bu parametre 1-1000 arasında değer alabilir.

ÖNERİ : Manyetik sürücüler için, bu ayar veri tabanı için kullanılan RAID 0 veya RAID 1 miror yapısındaki  sürücülerin sayısıdır. Örnek vermek gerekirse RAID 1 yapıda 10 diskiniz varsa bu parametre 5 olmalı yada RAID 0’da 10 tane diskinzi varsa bu değer 10 olmalı. Diskleri meşgul tutmak için gerekenden daha yüksek bir değer yalnızca fazladan CPU ek yüküne neden olur. SSD’ler ve diğer bellek tabanlı depolamalar çoğu zaman eşzamanlı birçok isteği işleyebilir, bu nedenle en iyi değer yüzlerce olabilir.

  • max_worker_processes (integer) : Sistemin destekleyebileceği maksimum background proses sayısını ayarlar. Varsayılan 8’dir. Standby sunucu çalıştırırken, bu parametreyi ana sunucudakiyle aynı veya daha yüksek bir değere ayarlamalısınız. Aksi takdirde, standby sunucusunda sorgulara izin verilmeyecektir. Öneri olarak burada şu değeri girin diyemem ama toplam CPU miktarınızın %60-%702ine denk gelen rakamı yuvarlayıp bu değeri kullanabiliriz.
  • max_parallel_workers_per_gather (integer) : Gather veya GatherMerge node’un kullanabileceği maksimum worker sayısı, Öneri olarak diyebileceğim max_worker_processes’e eşit olarak ayarlanmalıdır.
  • max_parallel_maintenance_workers (integer) : CREATE INDEX, vacuum gibi maintenance işlemlerinde kullanılacak maksimum proses sayısı.
  • max_parallel_workers (integer) : Paralel işlemler için sistemin destekleyebileceği maksimum worker sayısını ayarlar. Varsayılan değer 8’dir. Bu değeri artırırken veya azaltırken, ayrıca max_parallel_maintenance_workers ve max_parallel_workers_per_gather’ı ayarlamayı düşünün. Ayrıca, bu değer için max_worker_processes’ten daha yüksek olan bir ayarın hiçbir etkisi olmayacağını unutmayın, çünkü paralel çalışanlar bu ayar tarafından oluşturulan çalışan worker pooldan alır.

NOT : VACUUM ve ANALYZE ile ilgili parametrelere daha önce yazdığım linteki yazıdan ulaşabilirsiniz.

NOT : WAL ile ilgili parametrelere daha önce yazdığım linteki yazıdan ulaşabilirsiniz.

NOT : Replication ile ilgili parametrelere yazdığım linteki yazıdan ulaşabilirsiniz.

Loglama

  • log_statement (enum) : Hangi SQL sorgularının loga kaydedileceğini kontrol eder. Geçerli değerler none (off), ddl, mod ve all (tüm sorgular) ‘dir. Varsayılan olarak none’dır. Öneri olarak ben ddl’de bırakılmasını tavsiye ediyorum.
  • log_min_duration_statement (integer) : İfade en azından belirtilen süre boyunca çalıştırılırsa, tamamlanan her ifadenin süresinin loga kaydedilmesine neden olur. Örneğin, 250 ms’ye ayarlarsanız, 250 ms veya daha uzun süre çalışan tüm SQL sorguları loga kaydedilir. Bu parametrenin etkinleştirilmesi, uygulamalarınızdaki optimize edilmemiş sorguların izlenmesinde yardımcı olabilir. Öneri; bu parametreyi bir kaç dakika ile başlayarak sorunları çözdükçe azaltıp sql’leri iyileştirebilirsiniz. log_min_duration_sample’yi geçersiz kılar.
  • log_checkpoints (boolean) : Checkpoint ve restartpoint loglarının sunucu loguna kaydedilmesine neden olur. Yazılan buffer sayısı ve bunları yazmak için harcanan süre gibi bazı istatistikler log mesajlarına dahil edilir. Varsayılan kapalıdır.
  • log_lock_waits (boolean) : Bir session lock almak için deadlock_timeout süresinden daha uzun süre beklediğinde log mesajı üretilip üretilmeyeceğini kontrol eder. Bu, log bekleme sürelerinin düşük performansa neden olup olmadığını belirlemede yararlıdır. Varsayılan kapalıdır. Öneri vermem gerekirse bu parametreyi açmanın yararlı olduğunu düşünüyorum.
  • log_destination (string) : PostgreSQL, stderr, csvlog ve syslog dahil olmak üzere sunucu mesajlarını loga kaydetmek için çeşitli yöntemleri destekler. Varsayılan, değer stderr’dir.
  • logging_collector (boolean) : Bu parametre, stderr’e gönderilen log mesajlarını yakalayan ve bunları log dosyalarına yeniden yönlendiren bir background prosesi olan log toplayıcısını etkinleştirir.

NOT : log collector, iletileri asla kaybetmeyecek şekilde tasarlanmıştır. Bu, aşırı yük durumunda, colletor geride kaldığında ek log mesajları göndermeye çalışırken sunucu işlemlerinin engellenebileceği anlamına gelir. Bunun tersine, syslog mesajları yazamıyorsa bırakmayı tercih eder, bu da bu gibi durumlarda bazı mesajları loga kaydedemeyebileceği, ancak sistemin geri kalanını engellemeyeceği anlamına gelir.

  • log_directory (string) : Logging_collector etkinleştirildiğinde, bu parametre log dosyalarının oluşturulacağı dizini belirler. Varsayılan olarak $PGDATA altında log dizinidir.
  • log_filename (string) : Logging_collector etkinleştirildiğinde, bu parametre oluşturulan log dosyalarının dosya adlarını ayarlar. Varsayılan, postgresql-%Y-%m-%d_%H%M%S.log’dur. Buradaki isimlendirme da linux’deki date komutunun argümanlarından yararlanırız.
  • log_file_mode (integer) : Unix sistemlerinde bu parametre, logging_collector etkinleştirildiğinde log dosyalarının izinlerini ayarlar. Parametre değerinin, chmod ve umask sistem çağrıları tarafından kabul edilen biçimde belirtilen sayısal bir mod olması beklenir. Varsayılan izinler 0600’dür, yani yalnızca sunucu sahibi log dosyalarını okuyabilir veya yazabilir.
  • log_rotation_age (integer) : Logging_collector etkinleştirildiğinde, bu parametre, tek bir log dosyasının maksimum kullanım süresini belirler ve ardından yeni bir günlük dosyası oluşturulur. Bu değer birimsiz belirtilirse dakika olarak alınır. Varsayılan 24 saattir. Yeni log dosyalarının zamana dayalı olarak oluşturulmasını devre dışı bırakmak için sıfıra ayarlayabilirsiniz.
  • log_rotation_size (integer) : Logging_collector etkinleştirildiğinde, bu parametre tek bir log dosyasının maksimum boyutunu belirler. Bu miktarda veri bir log dosyasına gönderildikten sonra, yeni bir log dosyası oluşturulacaktır. Bu değer birimsiz belirtilirse kilobayt olarak alınır. Varsayılan değer 10 megabayttır. Yeni log dosyalarının boyuta dayalı olarak oluşturulmasını devre dışı bırakmak için sıfıra ayarlayabilirsiniz.
  • log_truncate_on_rotation (boolean) : Logging_collector etkinleştirildiğinde, bu parametre PostgreSQL’in aynı ada sahip herhangi bir mevcut log dosyasına eklemek yerine truncate (üzerine yazmasına) neden olur. Ancak, kesme, sunucu başlangıcı veya boyuta dayalı döndürme sırasında değil, yalnızca zamana dayalı döndürme nedeniyle yeni bir dosya açılırken meydana gelir. Kapalı olduğunda, önceden var olan dosyalar her durumda eklenecektir. Örneğin, bu ayarı postgresql-% H.log gibi bir log_filename ile birlikte kullanmak, yirmi dört saatlik günlük dosyalarının oluşturulmasına ve ardından döngüsel olarak bunların üzerine yazılmasına neden olur.
  • event_source (string) : event_source loga kaydetme etkinleştirildiğinde, bu parametre, logdaki PostgreSQL mesajlarını tanımlamak için kullanılan program adını belirler. Varsayılan, PostgreSQL’dir.
  • log_min_messages (enum) : Sunucu loguna hangi mesaj seviyelerinin yazılacağını kontrol eder. Geçerli değerler DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING, ERROR, LOG, FATAL ve PANIC’dir. Her seviye, onu takip eden tüm seviyeleri içerir. Seviye ne kadar geç olursa, loga o kadar az mesaj gönderilir. Varsayılan, WARNING’dir.
Severity Usage syslog eventlog
DEBUG1 .. DEBUG5 Geliştiriciler tarafından kullanılmak üzere art arda daha ayrıntılı bilgiler sağlar. DEBUG INFORMATION
INFO Kullanıcı tarafından dolaylı olarak istenen bilgileri sağlar, örneğin VACUUM VERBOSE’dan çıktı. INFO INFORMATION
NOTICE Uzun tanımlayıcıların kesildiğine dair bildirim gibi kullanıcılara yardımcı olabilecek bilgiler sağlar. NOTICE INFORMATION
WARNING Olası sorunlara ilişkin uyarılar sağlar, örneğin, bir transaction bloğu dışında COMMIT. NOTICE WARNING
ERROR Mevcut komutun iptal edilmesine neden olan bir hatayı bildirir. WARNING ERROR
LOG DBA lerin ilgilendiği bilgileri, örneğin checkpoint etkinliği raporlar. INFO INFORMATION
FATAL Mevcut oturumun iptal edilmesine neden olan bir hatayı bildirir. ERR ERROR
PANIC Tüm veritabanı oturumlarının iptal edilmesine neden olan bir hatayı bildirir. CRIT ERROR

 

  • log_min_error_statement (enum) : Hata durumuna neden olan SQL sorgularının sunucu loga kaydedileceğini kontrol eder. Geçerli SQL komutu, belirtilen önem derecesi veya daha yüksek herhangi bir ileti için log girişine dahil edilir. Geçerli değerler DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING, ERROR, LOG, FATAL ve PANIC’dir. Varsayılan ERROR’dir, bu da hatalara, günlük mesajlarına, önemli hatalara veya paniklere neden olan ifadelerin loga kaydedileceği anlamına gelir.
  • log_min_duration_sample (integer) : En azından belirtilen süre boyunca çalışan tamamlanmış ifadelerin süresinin örneklenmesine izin verir. Bu, log_min_duration_statement ile aynı türden günlük girişlerini üretir, ancak yalnızca log_statement_sample_rate tarafından kontrol edilen örnekleme oranıyla yürütülen deyimlerin bir alt kümesi için.
  • log_connections (boolean) : Client kimlik doğrulamasının başarıyla tamamlanmasının yanı sıra, sunucuyla yapılan her bağlantı girişiminin loga kaydedilmesine neden olur. Varsayılan kapalıdır.
  • log_disconnections (boolean) : Oturum sonlandırmalarının loga kaydedilmesine neden olur. Log çıktısı, log_connections ile benzer bilgiler ve ayrıca session süresi sağlar. Varsayılan kapalıdır.
  • log_line_prefix (string) : Bu, her log satırının başında çıkan printf tarzı bir dizedir. Daha çok log yönetim araçlarının ihtiyacı için kullanılır. Öneri; kullanmam gerekirse ben bu parametreyi genelde aşağıdaki gibi ayarlıyorum.
log_line_prefix='%t:%r:%u@%d:[%p]: ' 
Escape Effect Session only
%a Application name yes
%u User name yes
%d Database name yes
%r Remote host name or IP address, and remote port yes
%h Remote host name or IP address yes
%b Backend type no
%p Process ID no
%t Time stamp without milliseconds no
%m Time stamp with milliseconds no
%n Time stamp with milliseconds (as a Unix epoch) no
%i Command tag: type of session’s current command yes
%e SQLSTATE error code no
%c Session ID: see below no
%l Number of the log line for each session or process, starting at 1 no
%s Process start time stamp no
%v Virtual transaction ID (backendID/localXID) no
%x Transaction ID (0 if none is assigned) no
%q Produces no output, but tells non-session processes to stop at this point in the string; ignored by session processes no
%% Literal % no

 

  • log_replication_commands (boolean) : Her replication komutunun sunucuya kaydedilmesine neden olur. Varsayılan değer kapalı.
  • log_temp_files (integer) : Temp dosya adlarının ve boyutlarının l kaydedilmesini kontrol eder. Sıfır değeri, tüm temp dosya bilgilerini loga kaydederken, pozitif değerler yalnızca boyutu belirtilen veri miktarından büyük veya bu miktara eşit olan dosyaları loga kaydeder. Varsayılan ayar, böyle bir log kaydını devre dışı bırakan -1’dir.
  • log_timezone (string) : Sunucu loguna yazılan timezone için kullanılan saat dilimini ayarlar. TimeZone’dan farklı olarak, bu değer cluster çapındadır. varsayılan GMT’dir, ancak bu genellikle initdb aşamaında bu ayar değiştirilir; initdb, sistem ortamına karşılık gelen bir ayar kuracaktır.

İstatistik Parametreleri (Run-time Statistics)

Bu parametreler, sunucu çapında istatistik toplama özelliklerini kontrol eder. İstatistik toplama etkinleştirildiğinde, üretilen verilere pg_stat ve pg_statio sistem viewleri ailesi aracılığıyla erişilebilir.

  • stats_temp_directory (string) : Geçici istatistik verilerinin saklanacağı dizini ayarlar. Varsayılan, pg_stat_tmp’dir. Bunu RAM tabanlı bir dosya sistemine işaret etmek, fiziksel I/O gereksinimlerini azaltır ve performansın artmasını sağlayabilir. Öneri; bu dosyaya sık sık veri yazıldığı için ve içerisindeki verinin kaybedilmesi durumunda büyük sıkıntı yaratmayacağı için bence kesinlikle tmpfs dosya sistemi ile RAM tabanlı bir dosya oluşturup bu parametre değiştirilmelidir.
  • track_activities (boolean) : Her sessionın o anda çalışmakta olan komutunun yanı sıra, söz konusu komutun çalışmaya başladığı zaman hakkında bilgi toplanmasını sağlar. Bu parametre varsayılan olarak etkindir.
  • track_activity_query_size (integer) : Pg_stat_activity.query alanı için (her active session için geçerli olarak yürütülen komutun metnini depolamak için) ayrılan bellek miktarını belirtir. Varsayılan değer 1024 bayttır.
  • track_counts (boolean) : Veritabanı activitesi ile ilgili istatistiklerin toplanmasını sağlar. Bu parametre varsayılan olarak etkindir çünkü autovacuum daemon toplanan bilgilere ihtiyaç duyar.
  • track_io_timing (boolean) : Veritabanı I/O çağrılarının süresini ölçmek için etkinleştirir. Bu parametre varsayılan olarak kapalıdır, çünkü işletim sistemini geçerli saat için tekrar tekrar sorgulayacaktır, bu da bazı önemli ek yüklere neden olabilir. Sisteminizdeki zamanlamanın ek yükünü ölçmek için pg_test_timing aracını kullanabilirsiniz. I/O süresini pg_stat_database viewi içinde, BUFFERS seçeneği kullanıldığında EXPLAIN çıktısında ve pg_stat_statements tarafından da görüntüleyebiliriz.
  • track_functions (enum) : Fonksiyon çağrısı sayılarının ve çalışma süresinin izlenmesini sağlar.

Varsayılan Client Bağlantı Paremetreleri (Client Connection Defaults)

  • client_min_messages (enum) : Cliente hangi mesaj seviyelerinin gönderileceğini kontrol eder. Geçerli değerler DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, LOG, NOTICE, WARNING ve ERROR şeklindedir. Varsayılan, NOTICE’dir.
  • search_path (string) : Bu değişken, bir nesneye (tablo, veri türü, işlev, vb.) Scehama belirtilmemiş obe adıyla başvurulduğunda schemaların aranma sırasını belirtir. Farklı schemalarda aynı adlara sahip objeler olduğunda, search path’de ilk bulunan obje kullanılır. Search path’deki schemaların hiçbirinde bulunmayan bir objeye, yalnızca içerdiği schema’yı kullanarak erişebiliriz. Bu parametrenin varsayılan değeri “$user”, public’tir.
  • row_security (boolean) : Bu değişken, satır seviyesinde güvenlik politikası uygulamak yerine bir hatanın ortaya çıkıp çıkmayacağını kontrol eder. ON olarak ayarlandığında, politikalar normal şekilde uygulanır. OFF olarak ayarlandığında, en az bir güvenlik politikası uygulanacak sorgular hata fırlatır. Varsayılan ON’dur.
  • default_table_access_method (string) : Bu parametre, tablolar veya materialized views oluştururken, CREATE komutu açıkça bir erişim yöntemi(access method) belirtmiyorsa veya bir tablo erişim yöntemini belirtmeye izin vermeyen SELECT … INTO kullanıldığında kullanılacak varsayılan tablo erişim yöntemini belirtir. Varsayılan, heap’dir.
  • default_tablespace (string) : Bu değişken, CREATE komutu açıkça bir tablo alanı belirtmediğinde nesnelerin (tablolar ve dizinler) oluşturulacağı varsayılan tablespace’i belirtir.
  • temp_tablespaces (string) : Bu değişken, CREATE komutu açıkça bir tablo alanı belirtmediğinde nesnelerin (tablolar ve dizinler) oluşturulacağı varsayılan temp tablespace’i belirtir.
  • default_transaction_isolation (enum) : Her SQL transactionın bir izolasyon seviyesi vardır ve bu “read uncommitted”, “read committed”, “repeatable read”, veya “serializable” olabilir. Bu parametre, her yeni transactionın varsayılan izolasyon seviyesini kontrol eder. Varsayılan, “read committed” dir.
  • default_transaction_read_only (boolean) : Read-only transaction’nlar, temp olmayan tabloları değiştiremez. Bu parametre, her yeni transactionın varsayılan salt okunur durumunu kontrol eder. Varsayılan kapalıdır.
  • session_replication_role (enum) : Mevcut session için replication ile ilgili trigger ve kuralların tetiklenmesini kontrol eder. Olası değerler origin(varsayılan), replica and local’dir.
  • statement_timeout (integer) : Belirtilen süreden daha uzun süren herhangi bir sorguyu iptal eder. Sıfır değeri (varsayılan) zaman aşımını devre dışı bırakır.
  • lock_timeout (integer) : Tablo, index, satır veya başka bir veritabanı nesnesi üzerinde bir lock almaya çalışırken belirtilen süreden daha uzun süre bekleyen herhangi bir sorguyu iptal eder. Sıfır değeri (varsayılan) zaman aşımını devre dışı bırakır.
  • idle_in_transaction_session_timeout (integer) : Belirtilen süreden daha uzun süre boşta kalan açık bir transaction için sessionı sonlandırır. Sıfır değeri (varsayılan) zaman aşımını devre dışı bırakır.
  • DateStyle (string) : Tarih ve saat değerleri için görüntüleme formatını belirler. Tarihsel nedenlerden dolayı.
  • TimeZone (string) : Time zonu görüntülemek ve yorumlamak için saat dilimini ayarlar. Yerleşik varsayılan GMT’dir, ancak initdb aşamasında, sistem ortamına karşılık gelen bir ayar kuracaktır.
  • lc_messages (string) : Mesajların görüntülendiği dili ayarlar. Kabul edilebilir değerler sisteme bağlıdır. Bu değişken boş dizeye (varsayılan değerdir) ayarlanırsa, değer, sisteme bağlı bir şekilde sunucunun env ortamından miras alınır.

Diğer Parametreler

  • deadlock_timeout (integer) : Bu parametre, lock durumu olup olmadığını kontrol etmeden önce bir lock üzerinde beklemek için geçen süredir. Lock kontrolü nispeten pahalıdır, bu nedenle sunucu lockı her beklediğinde onu çalıştırmaz. Bu değeri artırmak, gereksiz lock kontrollerinde boşa harcanan süreyi azaltır, ancak gerçek lock hatalarının raporlanmasını yavaşlatır. Varsayılan değer bir saniyedir(1s).
  • wal_segment_size (integer) : WAL segmentlerinin boyutunu bildirir. Varsayılan değer 16MB’dir.
  • wal_block_size (integer) : WAL disk bloğunun boyutunu bildirir. Sunucuyu oluştururken XLOG_BLCKSZ değeri ile belirlenir. Varsayılan değer 8192 bayttır.
  • data_checksums (boolean) : Cluster için veri checksum’ın etkinleştirilip etkinleştirilmediğini bildirir. Öneri olarak söylemeliyim ki cluster’ınızda mutlaka checksum aktif olmalıdır.
  • checkpoint_timeout : saniye (varsayılan), dakika veya bir saat olarak ayarlanabilen bir zaman aşımı değeridir. varsayılan olarak 5 dk’dir. Öneri; Bu değeri ayarlarken veritabanınızın kullanım amacına göre karar vermek gerekir, OLAP tipi sistemlerde 1 güne kadar çıkartılabilirken OLTP amacı ile kullanılan yapılarda 5-10 dk gibi değerler seçilebilir.
  • checkpoint_completion_target (integer): Genellikle, PostgreSQL’in veriyi daha yavaş yazmaya çalışmasını sağlayan bir parametredir – checkpoint_completion_target * checkpoint_timeout zamanında bitirmek için. Genellikle 5 dakikaya ayarlı checkpoint_timeout’unuz vardır (değiştirmediyseniz) ve varsayılan checkpoint_completion_target 0,5’tir. Bu, PostgreSQL’in I/O yükünü düşürmek için checkpointin 2,5 dakika sürmesini sağlamaya çalışacağı anlamına gelir. Örnek verecek olursak dosyalara yazılacak 100GB verimiz var. Ve diskim saniyede 1 GB yazma kapasitesine sahip . Normal checkpoint yaparken (8.3’ten önceki gibi), verileri yazmak için yazma kapasitemizi 100 saniye boyunca %100’e kadar kullanılmasına neden olur. Ancak – checkpoint_completion_target 0,5 olarak ayarlandığında – PostgreSQL verileri 2,5 dakikada yazmaya çalışır, böylece yazma kapasitemizin hepsini kullanmaz.((100*1024)/(2,5*60)=682 MB/s kullanır). Öneri olarak burada bu paramtreye 0.7 kullanılmasını önerebilirim.
  • max_wal_size (integer) : Otomatik checkpoints sırasında WAL’ın büyümesine izin veren maksimum boyut. Varsayılan 1 GB’dir. Öneri olarak bu diskimizde yer varsa bu değeri artırmanızı tavsiye ederim.
  • min_wal_size (integer) : WAL disk kullanımı bu ayarın altında kaldığı sürece, eski WAL dosyaları her zaman ileride kullanılmak üzere kaldırılmak yerine checkpoint noktasında geri dönüştürülür. Örneğin büyük toplu işleri çalıştırırken, WAL kullanımındaki ani artışları işlemek için yeterli WAL alanının ayrıldığından emin olmak için kullanılabilir. Varsayılan 80 MB’dir.
  • seq_page_cost (floating point) : Sequential(sıralı) okumanın maliyetine ilişkin planlayıcının tahminini ayarlar. Varsayılan değer 1.0’dır.
  • random_page_cost (floating point) : Planlayıcının, Sequential olarak getirilmeyen bir disk sayfasının maliyetine ilişkin tahminini ayarlar. Varsayılan 4.0’dır. Bu değerin seq_page_cost değerine göre azaltılması, sistemin index taramalarını tercih etmesine neden olacaktır; yükseltmek, index taramalarının nispeten daha pahalı görünmesini sağlayacaktır. Öneri; Mekanik disk depolamaya random access normalde dört kez sequential erişimden çok daha pahalıdır. Ancak, indexe alınmış okumalar gibi diske rastgele erişimlerin çoğunun cache olduğu varsayıldığından daha düşük bir varsayılan kullanılır (4.0). Varsayılan değer, rastgele erişimi sıralıdan 40 kat daha yavaş modellerken, rastgele okumaların% 90’ının önbelleğe alınmasını beklemek olarak düşünülebilir. İş yükünüz için% 90 önbellek oranının yanlış bir varsayım olduğuna inanıyorsanız, rastgele depolama okumalarının gerçek maliyetini daha iyi yansıtmak için random_page_cost’u artırabilirsiniz. Buna bağlı olarak, verilerinizin tamamen önbellekte olma olasılığı varsa, örneğin veritabanı toplam sunucu belleğinden daha küçükse, random_page_cost’u düşürmek uygun olabilir. Yada SSD gibi random access’de hızlı bir I/O yapan yapınız varsa yine bu değer bir miktar azaltılabilir.
  • restart_after_crash (boolean) : Varsayılan değer olan açık olarak ayarlandığında, PostgreSQL backend çökmesinden sonra otomatik olarak yeniden başlatılacaktır. Bu değeri açık olarak bırakmak, normalde veritabanının kullanılabilirliğini en üst düzeye çıkarmanın en iyi yoludur. Bununla birlikte, PostgreSQL’in clusterware tarafından çağrılması gibi bazı durumlarda, yeniden başlatmayı devre dışı bırakmak, cluster yazılımının kontrolü ele geçirebilmesi ve uygun gördüğü eylemleri gerçekleştirebilmesi için yararlı olabilir.
  • data_sync_retry (boolean) : Varsayılan değer olan kapalı olarak ayarlandığında, PostgreSQL, dirty verileri dosya sistemine boşaltamama durumunda PANIC düzeyinde bir hata oluşturacaktır. Bu, veritabanı sunucusunun çökmesine neden olur. Açık olarak ayarlanırsa, PostgreSQL bunun yerine bir hata bildirecek, ancak veri temizleme işleminin daha sonraki checkpoint’de yeniden denenebilmesi için çalışmaya devam edecektir.
  • block_size (integer) : Bir disk bloğunun boyutunu bildirir. Sunucuyu oluştururken BLCKSZ’nin değeri ile belirlenir. Varsayılan değer 8192 bayttır.
  • data_directory_mode (integer) : Unix sistemlerinde bu parametre, başlangıçta(data_directory) ile tanımlanan veri dizininin izinlerini bildirir.
  • segment_size (integer) : Bir dosya segmentinde saklanabilecek blok (page) sayısını bildirir. Sunucuyu oluştururken RELSEG_SIZE değerine göre belirlenir. Segment dosyasının bayt cinsinden maksimum boyutu, segment_size ile blok_boyutu çarpımına eşittir; varsayılan olarak 1GB’dir.
  • server_version (string) : Sucunun versiyon numarasını bildirir. Sunucuyu oluştururken PG_VERSION değeri ile belirlenir.

Mustafa Bektaş Tepe
İyi Çalışmalar

 126 total views,  8 views today