Pythontr

husonet | Tarih: 19.08.2024

PostgreSQL'i Yüksek Performanslı Bir Makinede Optimize Etme: 16 Çekirdek, 48GB RAM, 240GB SSD İçin İdeal Ayarlar

PostgreSQL'i Yüksek Performanslı Bir Makinede Optimize Etme: 16 Çekirdek, 48GB RAM, 240GB SSD İçin İdeal Ayarlar

Bu makalede, 16 çekirdekli CPU, 48GB RAM ve 240GB SSD'ye sahip güçlü bir makine için PostgreSQL veritabanını nasıl optimize edebileceğinizi öğreneceksiniz. Donanımınızı tam kapasiteyle kullanarak veritabanı performansını artırmak için gereken yapılandırma ayarlarını adım adım keşfedin.

PostgreSQL, yüksek performanslı ve büyük ölçekli veritabanı uygulamaları için esnek bir yapılandırma sunar. Veritabanı performansını optimize etmek için donanımınıza uygun bir PostgreSQL yapılandırması yapabilirsiniz. 16 çekirdekli CPU, 48 GB RAM ve 240 GB SSD depolama ile çalışan bir makine için PostgreSQL yapılandırmanızı optimize etmek için aşağıdaki ayarları yapabilirsiniz.


Temel PostgreSQL Yapılandırma Ayarları


Aşağıdaki ayarları PostgreSQL yapılandırma dosyanız olan postgresql.conf dosyasında (/etc/postgresql/<version>/main/postgresql.conf) yapabilirsiniz:


CPU Paralelliği


PostgreSQL, çok çekirdekli CPU'ları kullanabilir, bu nedenle aşağıdaki parametreleri ayarlayın:



max_parallel_workers = 16
max_parallel_workers_per_gather = 4


    max_parallel_workers: Tüm veritabanı için maksimum paralel işlemci işçi sayısını ayarlar.
    max_parallel_workers_per_gather: Bir sorgu başına kullanılacak maksimum paralel işçi sayısını ayarlar.

Bellek Ayarları


Makinenizin 48 GB RAM'ini verimli bir şekilde kullanmak için aşağıdaki bellek ayarlarını yapabilirsiniz:



shared_buffers = 12GB
work_mem = 16MB
maintenance_work_mem = 2GB


  • shared_buffers: Veritabanının ana bellek havuzu. Bu genellikle toplam RAM'in %25'i kadar ayarlanır, ancak büyük sistemlerde bu değer artırılabilir.
  • work_mem: Sorgu başına kullanılacak bellek miktarı. Bu değeri, aynı anda çalışacak sorgu sayısına göre ayarlayın.
  • maintenance_work_mem: Veritabanı bakımı için kullanılacak bellek miktarı (örneğin, VACUUM, CREATE INDEX işlemleri sırasında).

Disk ve Giriş/Çıkış (I/O) Ayarları


SSD depolama ile çalışan bir sistemde aşağıdaki I/O ayarlarını optimize edebilirsiniz:



effective_io_concurrency = 200
checkpoint_completion_target = 0.9


  • effective_io_concurrency: SSD gibi hızlı disklerde I/O işlemlerinin paralel olarak nasıl yapılacağını belirler. Değer, disk sayısına ve tipine göre ayarlanmalıdır. SSD için daha yüksek bir değer uygundur.
  • checkpoint_completion_target: Checkpoint işlemlerinin ne kadar sürede tamamlanacağını kontrol eder. Bu değeri daha yüksek ayarlamak, disk I/O yükünü azaltabilir.

WAL (Write-Ahead Logging) Ayarları


PostgreSQL'in veri güvenliğini sağlamak için kullandığı WAL ayarlarını optimize edin:



wal_buffers = 16MB
max_wal_size = 4GB
min_wal_size = 1GB


  • wal_buffers: WAL logları için ayrılan bellek. Genellikle shared_buffers değerinin 1/32'si olarak ayarlanır.
  • max_wal_size ve min_wal_size: WAL dosyalarının maksimum ve minimum boyutları.

Bağlantı Ayarları


Sistemin kaldırabileceği bağlantı sayısını ayarlayın:



max_connections = 300

max_connections: Aynı anda izin verilen maksimum bağlantı sayısı. Bağlantı sayısını iş yükünüze göre ayarlayın. Çok yüksek ayarlamak bellek tüketimini artırabilir.


Autovacuum Ayarları


Autovacuum işlemlerini optimize etmek, performansı artırabilir:



autovacuum_max_workers = 6
autovacuum_naptime = 10s
autovacuum_vacuum_cost_delay = 10ms
autovacuum_vacuum_scale_factor = 0.02
autovacuum_analyze_scale_factor = 0.01


  • autovacuum_max_workers: Aynı anda çalışan autovacuum işlemlerinin maksimum sayısı.
  • autovacuum_naptime: Autovacuum işlemleri arasındaki bekleme süresi.
  • autovacuum_vacuum_scale_factor ve autovacuum_analyze_scale_factor: Autovacuum ve analiz işlemlerinin ne sıklıkla çalıştırılacağını belirler.

Ekstra: PostgreSQL Performans Ayarları



  • random_page_cost = 1.1: SSD kullanımı için rastgele sayfa maliyetini düşürün.
  • seq_page_cost = 1.0: Sıralı sayfa maliyetini SSD için optimize edin.
  • default_statistics_target = 100: İstatistik hedefini ayarlayın, büyük tablolar için artırılabilir.

Yapılandırmayı uygulamak için restart yapalım



systemctl restart postgresql

PostgreSQL'i yüksek performanslı bir makinede optimize etmek için ayrıca kernel ayarlarını yaparak performansı artırabilirsiniz. İşte 16 çekirdek, 48GB RAM ve 240GB SSD'li bir sistem için önerilen bazı kernel ayarları:


Shared Memory (Paylaşılan Bellek)


PostgreSQL, büyük veritabanları için paylaşılan belleğe ihtiyaç duyar. shared_buffers parametresi genellikle toplam RAM'in %25-40'ı kadar olmalıdır.



# /etc/sysctl.conf dosyasına ekleyin
kernel.shmmax = 32GB
kernel.shmall = 8388608

Kernel Parameters



# /etc/sysctl.conf dosyasına ekleyin
vm.swappiness = 1
vm.dirty_background_ratio = 5
vm.dirty_ratio = 20
vm.overcommit_memory = 1
vm.overcommit_ratio = 100
kernel.sem = 250 32000 100 128
fs.file-max = 1000000

vm.swappiness = 1

Açıklama: swappiness, Linux çekirdeğinin fiziksel belleği (RAM) ne zaman takas (swap) alanına taşıyacağına karar vermek için kullandığı bir parametredir. Bu değer 0 ile 100 arasında olabilir.


Değer: 1 olarak ayarlandığında, çekirdek yalnızca zorunda kaldığında belleği takas alanına taşır. Bu, sistemin RAM'i maksimum düzeyde kullanmasını sağlar, swap kullanımını minimize eder ve performansı artırır.


Neden Önemli? Düşük swappiness değeri, PostgreSQL gibi bellek yoğun uygulamalar için performansı artırır çünkü disk yerine RAM kullanımı teşvik edilir.


vm.dirty_background_ratio = 5

Açıklama: dirty_background_ratio, sistem belleğinin yüzde kaçının "kirli" (henüz diske yazılmamış) veri içerebileceğini belirler. Bu eşiğe ulaşıldığında, arka planda bir süreç devreye girer ve verileri diske yazmaya başlar.


Değer: 5, belleğin %5'inin kirli veriyle dolabileceğini ve bu değere ulaşıldığında verilerin arka planda diske yazılmaya başlayacağını belirtir.


Neden Önemli? Bu ayar, disk I/O işlemlerinin sistem performansını etkilemeden arka planda gerçekleşmesini sağlar ve PostgreSQL gibi uygulamaların daha hızlı çalışmasına katkıda bulunur.


vm.dirty_ratio = 20

Açıklama: dirty_ratio, sistem belleğinin yüzde kaçının "kirli" veriyle dolabileceğini belirler. Bu eşiğe ulaşıldığında, sistem tüm I/O işlemlerini durdurur ve verileri diske yazar.


Değer: 20, belleğin %20'si kirli veriyle dolduğunda, sistemin bu verileri diske yazmaya zorlanacağını belirtir.


Neden Önemli? Bu ayar, kirli verilerin birikmesini ve bellek kullanımının aşırı artmasını önler, böylece sistemde ani I/O tıkanmalarını engeller.


vm.overcommit_memory = 1

Açıklama: overcommit_memory, çekirdeğin uygulamalara fiziksel bellekten daha fazla bellek ayırıp ayıramayacağını belirler.


Değer: 1, çekirdeğin bellek overcommit yapmasına izin verir, yani uygulamalar ihtiyaç duydukları kadar bellek talep edebilir, ancak fiziksel bellek yetmezse çekirdek swap kullanır veya bellek hatası verir.


Neden Önemli? Bu ayar, PostgreSQL gibi uygulamaların ihtiyacına göre bellek tahsis edebilmesine olanak tanır, bu da bellek kullanımını daha esnek hale getirir.


vm.overcommit_ratio = 100

Açıklama: overcommit_ratio, çekirdek overcommit yaparken dikkate alınacak bellek yüzdesini belirtir. Bu değer, vm.overcommit_memory ayarı 2 iken dikkate alınır, ancak yine de sistemde kullanılabilir bellek miktarını belirlemekte yardımcı olabilir.


Değer: 100, çekirdeğin overcommit için mevcut fiziksel belleğin %100'ünü kullanabileceğini belirtir.


Neden Önemli? Bu ayar, sistemin bellek tahsisini esnek hale getirir ve bellekle ilgili hataları minimize eder.


kernel.sem = 250 32000 100 128

Açıklama: sem (semaphore) parametresi, çekirdeğin semaphore ayarlarını yapılandırır. Semaphore'lar, çok işlemcili sistemlerde işlemler arası senkronizasyon için kullanılır.


Değerler:

  • 250: Maksimum semaphore sayısı.
  • 32000: Bir semaphore setinde bulunabilecek maksimum semaphore sayısı.
  • 100: Bir işlemde kullanılabilecek maksimum semaphore sayısı.
  • 128: Maksimum semaphore seti sayısı.

Neden Önemli? Bu ayar, PostgreSQL gibi yoğun işlemci ve işlem kullanımına sahip uygulamalarda semaphore'ların yetersiz kalmasını önler ve performansı artırır.


fs.file-max = 1000000

Açıklama: file-max parametresi, sistemde aynı anda açılabilecek maksimum dosya tanımlayıcı (file descriptor) sayısını belirler.


Değer: 1000000, sistemin aynı anda 1 milyon dosya tanımlayıcıya kadar destekleyeceğini belirtir.


Neden Önemli? Yüksek trafikli bir PostgreSQL sunucusu, aynı anda çok sayıda dosya tanımlayıcıya ihtiyaç duyabilir. Bu ayar, sistemde "Too many open files" hatasının önlenmesine yardımcı olur ve veritabanı performansını artırır.


I/O Scheduler (Girdi/Çıktı Zamanlayıcısı)

SSD kullanıyorsanız, I/O zamanlayıcısını noop veya deadline olarak ayarlayabilirsiniz:



# /etc/default/grub dosyasına ekleyin
GRUB_CMDLINE_LINUX_DEFAULT="elevator=deadline"

# Grub'u yeniden yükleyin
update-grub

Bu satır, sisteminizin başlatıldığında deadline I/O zamanlayıcısını kullanacağını belirtir. deadline zamanlayıcısı, SSD gibi hızlı depolama birimlerinde daha iyi performans sunar çünkü verileri zamanında ve daha tutarlı bir şekilde işlemesi için optimize edilmiştir.


Transparent Huge Pages (THP)



GRUB_CMDLINE_LINUX_DEFAULT="elevator=deadline transparent_hugepage=never"
# Grub'u yeniden yükleyin
update-grub

I/O (Girdi/Çıktı) ve Disk Ayarları


PostgreSQL disk erişiminde yüksek performans sağlamak için aşağıdaki disk ayarlarını yapabilirsiniz:



# /etc/fstab dosyasına ekleyin (SSD için önerilen ayarlar)
/dev/sda1 / ext4 defaults,noatime,nodiratime,discard,errors=remount-ro 0 1

defaults

Bu, birçok yaygın seçenek için varsayılanları belirtir. Varsayılan seçenekler şunlardır: rw, suid, dev, exec, auto, nouser, async.



  • rw: Dosya sistemi okuma-yazma modu ile bağlanır.
  • suid: Set-user-ID ve set-group-ID bitlerinin çalışmasına izin verir.
  • dev: Cihaz dosyalarının kullanımına izin verir.
  • exec: İkili dosyaların çalıştırılmasına izin verir.
  • auto: Sistem başlatıldığında dosya sistemi otomatik olarak bağlanır.
  • nouser: Sadece root kullanıcı bu dosya sistemini bağlayabilir.
  • async: Girdi/çıktı işlemleri asenkron olarak gerçekleştirilir.

noatime

Dosyalara erişildiğinde erişim zamanını (access time) güncellemeyi devre dışı bırakır.


Bu, özellikle SSD gibi hızlı diskler için performansı artırır çünkü her dosya erişiminde disk yazma işlemi yapılmaz.


Bu seçenek, disk I/O (girdi/çıktı) işlemlerinin azaltılmasına yardımcı olur, böylece performans artışı sağlar.


nodiratime

noatime ile benzerdir, ancak bu seçenek sadece dizinler (directories) için geçerlidir.


Dizin erişim zamanını güncellemeyi devre dışı bırakır, bu da ek performans iyileştirmesi sağlar.


discard

Bu seçenek, dosya sistemi silme işlemleri sırasında SSD'lere "TRIM" komutunu gönderir.


TRIM komutu, SSD'lerin silinmiş veri bloklarını işaretlemesine ve yeniden yazmaya hazır hale getirmesine olanak tanır, böylece SSD performansı artırılır ve ömrü uzatılır.


errors=remount-ro

Bu, dosya sisteminde bir hata meydana gelirse, dosya sisteminin sadece okuma modunda (read-only) tekrar bağlanmasını sağlar.


Bu, veri kaybını önlemek için güvenlik amacıyla kullanılır. Bir hata oluştuğunda, dosya sistemi sadece okuma modunda bağlanır, bu da veri yazma işlemlerini durdurur ve olası veri bozulmasını engeller.


0 1

Son iki rakam fstab dosyasının sonundaki iki sütuna karşılık gelir:



  • 0: Dump yedeği almak için dosya sisteminin dikkate alınıp alınmayacağını belirler. 0 değeri, bu dosya sisteminin yedeklenmeyeceği anlamına gelir.
  • 1: Bu rakam, sistem başlatılırken dosya sisteminin kontrol edilip edilmeyeceğini ve hangi sırayla edileceğini belirler. 1 değeri, bu dosya sisteminin birinci öncelikte kontrol edileceğini belirtir. Ana dosya sistemi (root) genellikle 1 olarak ayarlanır, diğer dosya sistemleri ise 2 olarak ayarlanır.

Networking (Ağ Ayarları)

net.core.somaxconn = 1024
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 300
net.core.netdev_max_backlog = 10000

net.core.somaxconn = 1024

Açıklama: somaxconn parametresi, bir TCP soketi için kuyrukta bekletilebilecek maksimum bağlantı isteklerinin sayısını belirler.


Değer: 1024 olarak ayarlandığında, bir soket bağlantı isteği kuyrukta en fazla 1024 bağlantı bekleyebilir.


Neden Önemli? Bu ayar, yüksek trafikli sunucularda önemlidir. Örneğin, bir web sunucusu bir anda çok sayıda bağlantı isteği aldığında, bu bağlantılar kuyruğa alınır. Kuyruk dolarsa, yeni bağlantı istekleri reddedilebilir. Bu ayarın yüksek bir değere ayarlanması, özellikle yoğun trafik alan sunucularda daha fazla bağlantının kabul edilmesini sağlar.


net.ipv4.tcp_fin_timeout = 15

Açıklama: tcp_fin_timeout, bir bağlantı kapanma (FIN_WAIT_2) durumunda ne kadar süreyle bekleyeceğini belirler.


Değer: 15 saniye olarak ayarlandığında, bir TCP bağlantısı kapanırken bu durumda en fazla 15 saniye bekler.


Neden Önemli? Bu ayar, özellikle uzun süre açık kalan, ancak artık kullanılmayan bağlantıların hızlıca kapanmasını sağlar. Bu, sistemin gereksiz yere bağlantı durumlarını saklamasını engelleyerek kaynak kullanımını optimize eder.


net.ipv4.tcp_tw_reuse = 1

Açıklama: tcp_tw_reuse, zaman aşımına uğramış (TIME_WAIT durumunda) TCP soketlerinin yeni bağlantılar için tekrar kullanılmasını sağlar.


Değer: 1 olarak ayarlandığında, TIME_WAIT durumundaki soketler yeni gelen bağlantılar için yeniden kullanılabilir.


Neden Önemli? Özellikle yüksek trafikli sunucularda, çok sayıda kısa süreli TCP bağlantısı açıldığında, TIME_WAIT durumunda kalan soketlerin yeniden kullanılmasını sağlamak, soket sayısının hızla tükenmesini önler ve performansı artırır.


net.ipv4.tcp_keepalive_time = 300

Açıklama: tcp_keepalive_time, bir TCP bağlantısı üzerinden herhangi bir veri aktarımı olmadığında, bağlantının aktif olup olmadığını kontrol etmek için ne kadar süreyle bekleyeceğini belirler.


Değer: 300 saniye (5 dakika) olarak ayarlandığında, bağlantı üzerinde 5 dakika boyunca herhangi bir veri aktarımı yapılmadığında keepalive mesajları gönderilmeye başlanır.


Neden Önemli? Bu ayar, uzun süre etkin olmayan bağlantıları tespit etmek ve gerektiğinde sonlandırmak için kullanılır. Böylece, kullanılmayan bağlantıların gereksiz yere sistem kaynaklarını tüketmesi önlenir.


net.core.netdev_max_backlog = 10000

Açıklama: netdev_max_backlog, ağ arayüzü tarafından işlenmeyi bekleyen maksimum veri paketi sayısını belirler.


Değer: 10000 olarak ayarlandığında, ağ arayüzü işleyemediği verileri maksimum 10.000 pakete kadar kuyrukta tutabilir.


Neden Önemli? Yüksek hızlı ağlarda, sistemin anlık olarak işleyebileceğinden daha fazla veri paketi alması durumunda bu paketler kuyruğa alınır. Bu ayarın yüksek bir değere ayarlanması, ağ arayüzünün gelen trafiği daha iyi yönetmesini sağlar ve paket kaybını azaltır.


Değişiklikleri hemen uygulamak için.


sysctl -p