Postgres Nasıl Yavaşlatılır
(byteofdev.com)- Postgres performansını aşırı derecede düşürebilecek parametre kombinasyonlarına yönelik deneysel bir yaklaşım tanıtılıyor
- Genellikle önbellek, indeks, WAL, I/O gibi çeşitli unsurlar ters yönde ayarlanıyor
- shared_buffers, autovacuum, WAL ile ilgili seçenekler uç noktalara çekilerek TPS'de 42.000 kat düşüş elde ediliyor
- Yeni Postgres 18/19 sürümlerindeki io_method ve io_workers gibi güncel özellikler de kullanılarak tek I/O iş parçacığı sınırı deneyi yapılıyor
- Deney sonuçları, yalnızca Postgres yapılandırma dosyasıyla bile aşırı performans düşüşünün mümkün olduğunu kanıtlıyor
Genel Bakış
Bu yazı, normalde hızlandırmaya odaklanan Postgres ayarlamasının tersine, yalnızca yavaşlatmayı hedefleyerek çeşitli PostgreSQL yapılandırma değerlerini değiştirip performansı sınırına kadar düşürmeye yönelik bir deneyin içeriğini anlatıyor.
Testler, BenchBase'in TPC-C iş yükü (128 depo, 100 bağlantı, her biri en fazla saniyede 10.000 işlem denemesi, güncel Postgres 19devel, Ryzen 7950x, 32GB RAM, 2TB SSD ortamı, 120 saniye çalışma) temelinde yapıldı.
Varsayılan durumda performans 7082 TPS idi ve her parametre müdahalesiyle ne kadar yavaşladığı adım adım gözlemlendi.
Önbelleği Büyük Ölçüde Azaltmak
- Postgres, disk I/O'yu azaltmak için güçlü bir önbellek (
shared_buffers) kullanır - Varsayılan değerden (10GB)
shared_buffers8MB'a düşürüldüğünde, TPS 1/7 seviyesine (1052 TPS) geriledi - Önbellek isabet oranı %99,90'dan %70,52'ye düştü, read syscall sayısında 300 kattan fazla artış gözlemlendi
- 128kB'a kadar düşürülmeye çalışıldı ancak Postgres en az yaklaşık 2MB'a izin verdiği için performans 485 TPS'ye kadar daha da geriledi
Arka Plan İşlerini Artırmak (autovacuum ayarı)
autovacuumile ilgili tüm eşikler en düşük seviyeye çekilerek, neredeyse her işlemde vacuum çalışacak hale getirildiautovacuum_vacuum_insert_threshold=1,autovacuum_naptime=1gibi kombinasyonlar- Vacuum, fiilen yapacak işi olmasa bile neredeyse her 1 saniyede bir tekrar çalıştı
- Bu süreçte
maintenance_work_mem128kB'a düşürüldü, tümautovacuumgünlükleme seçenekleri etkinleştirildi - Sonuç olarak TPS 293'e düştü (başlangıca göre 1/20'nin altı)
autovacuumile ilgili gerçek zamanlı günlükler üzerinden, sık arka plan işlerinin performans düşüşünün nedeni olduğu doğrulandı
WAL (Write-Ahead Log) Yazma İşlerini En Kötü Hale Getirmek
- WAL ile ilgili parametrelerin tamamı en kötü duruma ayarlandı
wal_writer_flush_after=0,wal_writer_delay=1,wal_sync_method=open_datasyncvb.- Checkpoint her 30 saniyede bir zorlandı,
min/max_wal_size=32MBile minimumda tutuldu wal_level=logical,wal_log_hints=ongibi ayarlarla WAL'e gereksiz bilgiler de yazdırıldıtrack_wal_io_timing,summarize_walgibi ek yükler de etkinleştirildi
- Bunun sonucunda TPS 98'e kadar düştü (başlangıca göre 1/70'in altı)
- Günlüklerde checkpoint'lerin birkaç yüz ms arayla tekrarlandığı gibi anormal davranışlar görüldü
İndeks Etkisini Ortadan Kaldırmak
- İndeks kullanımının tamamı, maliyeti en yüksek hesaplanan değerler (
random_page_cost=1e300,cpu_index_tuple_cost=1e300) olarak ayarlanarak fiilen etkisiz hale getirildi - Kararlılığı korumak için
shared_buffers8MB'a çıkarıldı, TPS ise 0,87'ye kadar düştü (7.000 kat yavaşlama sağlandı)
Tek I/O İş Parçacığını Zorlamak
- En yeni Postgres 18+ özellikleri kullanıldı
io_method=worker,io_workers=1ile tüm I/O tek bir worker iş parçacığına zorlandı- TPS 0,016'ya kadar daha da düştü (42.000 kat yavaşlama)
- 100 bağlantılı, 120 saniyelik testte yalnızca 11 işlemin başarılı olabildiği kadar sınırlı bir performans görüldü
Sonuç ve Yeniden Üretim Rehberi
- Toplam 32 farklı parametre müdahalesiyle üretim veritabanının fiilen "felç" durumuna getirilebildiği kanıtlandı
- Yalnızca
postgresql.confayarlarına dokunarak performans düşüşü en üst düzeye çıkarılabiliyor - Deneyi yeniden üretmek isteyen kullanıcıların BenchBase Postgres'i, yukarıda belirtilen TPC-C ortamını ve tüm yapılandırma listesini incelemesi gerekiyor
- Bazı ek parametreler veya daha fazla yavaşlatma denemesi dahil edilmedi
Parametrelerin Kısa Özeti
shared_buffers = 8MBautovacuumile ilgili threshold/scale_factor değerleri = 0~1, en düşük seviye- Vacuum ile ilgili maliyet, bellek ve günlükleme: en düşük ve en yüksek uçlara çekilmiş durumda
- WAL ile ilgili sync/flush/günlükleme/seviye vb.: yavaş kalacak şekilde ayarlanmış
- İndeks ile ilgili
random_page_cost,cpu_index_tuple_cost:1e300olarak ayarlanmış io_method = worker,io_workers = 1- Diğer ayrıntılı değerler için metindeki listeye bakın
Kapanış
- Sadece
postgresql.confdosyasıyla bile aşırı performans düşüşü tetiklenebilir - Gerçek hayatta bu kombinasyonlar tersinden, yani verimli performans iyileştirmesi için referans alınmaya değer
- Yazı, deney sırasında yazarın bel ağrısı nedeniyle ara vermek zorunda kaldığını belirterek sona eriyor
2 yorum
Hacker News görüşleri
Harika. Bu tür bir yaklaşımı gerçekten çok seviyorum.