- Şu anda beta1 aşamasındaki Postgres 18, asenkron I/O (Asynchronous I/O) desteği getiriyor ve özellikle bulut ortamlarında okuma performansını büyük ölçüde iyileştiriyor
- Yeni
io_methodayarıyla geleneksel sync yönteminin yanı sıra worker ve io_uring yöntemleri seçilebiliyor - AWS tabanlı benchmark sonuçlarına göre,
io_uringkullanıldığında disk okuma performansı 3 kata kadar artıyor - Ancak asenkronlaşma nedeniyle mevcut sorgu analizi (EXPLAIN ANALYZE) içindeki I/O zamanlamalarını yorumlamak daha zor hale geliyor
- Yeni izleme görünümü (
pg_aios) ve ayar parametreleri (effective_io_concurrency) ile performans optimizasyonu gerekiyor
Postgres 18’de asenkron I/O’nun kullanıma girmesi
- Geleneksel olarak Postgres, blocking I/O modelini kullanıyordu; bu nedenle her disk okuması tamamlanana kadar bekliyordu
- Ağ tabanlı depolamada (EBS vb.) yüksek gecikme süreleri nedeniyle bulut ortamlarında darboğaz oluşuyordu
- Asenkron I/O, birden çok disk okumasının paralel işlenmesini mümkün kılarak CPU kullanımını ve genel throughput’u artırıyor
Postgres 17’de ön hazırlık: Read Stream API
- Postgres 17,
read_streamAPI’sini sunarak okuma işlemlerinin soyutlamasını standartlaştırdı - Ancak bu yapı hâlâ OS page cache’e dayanıyor ve Postgres’in kendi shared buffer’ına doğrudan yansımıyor
- Postgres 18 ile kernel ipuçları yerine doğrudan asenkron okuma mümkün hale geliyor
Yeni ayar: io_method
- Postgres 18,
postgresql.confiçineio_methodayarını ekliyor ve şu 3 seçeneği sunuyor:
io_method = sync
- Mevcut Postgres ile aynı senkron yöntem
posix_fadvise()tabanlı okuma önceden getirme yaklaşımını kullanıyor
io_method = worker (varsayılan)
- I/O’ya adanmış worker process’ler veriyi asenkron olarak okuyup shared buffer’a iletiyor
- Ana process, okuma işlemi kesilmeden çalışmaya devam edebiliyor
- Varsayılan worker sayısı 3 ve
io_workersayarıyla değiştirilebiliyor
io_method = io_uring
- Linux kernel 5.1 ve üzeri sürümlerde kullanılabilen yüksek performanslı I/O arayüzü
- Worker process olmadan da kernel ile paylaşılan ring buffer üzerinden doğrudan asenkron okuma yapabiliyor
- Güncel kernel, dosya sistemi ve yapılandırma gerektiriyor
Asenkron I/O performans benchmark’ı (AWS tabanlı)
- Test ortamı:
- AWS c7i.8xlarge (32 vCPU, 64GB RAM)
- 100GB io2 EBS, 20.000 IOPS
- 3.5GB büyüklüğündeki bir tabloda
SELECT COUNT(*)çalıştırıldı
Cold cache performans karşılaştırması:
| Sürüm/Ayar | Çalışma süresi (ms) |
|---|---|
| Postgres 17 (sync) | 15,831 |
| Postgres 18 (sync) | 15,071 |
| Postgres 18 (worker) | 10,052 |
| Postgres 18 (io_uring) | 5,723 |
io_uring,syncile karşılaştırıldığında 2,8 kat performans artışı sağlıyor- Bulutta disk gecikmesini azaltmada özellikle etkili
effective_io_concurrency ayarı
- Postgres 18’de bu parametre, iç asenkron read-ahead isteklerinin sayısını etkiliyor
- Varsayılan değer 1’den 16’ya yükseltildi ve
io_combine_limitile çarpılarak en yüksek okuma aralığı belirleniyor - Gecikmesi yüksek bulut ortamlarında daha büyük değerler avantaj sağlayabilir, ancak iş yüküne göre benchmark yapılması gerekiyor
Yeni izleme aracı: pg_aios
pg_stat_activityiçinde asenkron işlemlerAioIoCompletionolayı olarak göründüğünden backend bekleme analizini yapmak zorlaşıyorio_uringdurumunda işlemler doğrudan kernel tarafından yürütüldüğü için I/O durumu Postgres içinde görünmüyorpg_aiosgörünümü üzerinden o anda devam eden asenkron isteklerin ayrıntıları görülebiliyorSELECT * FROM pg_aios;
SUBMITTED,COMPLETED_IOgibi durumlar ve hedef blok bilgileri görülebiliyor
Dikkat edilmesi gereken nokta: I/O zamanlama bilgilerinin yorumlanması değişiyor
- Mevcut
EXPLAIN ANALYZEiçindekiI/O Timings, yalnızca senkron yöntemde güvenilir kabul edilebilir - Asenkron
workerveio_uringkullanıldığında paralel işleme ve worker dağılımı nedeniyle zamanlama bilgisinin yorumu bozulabiliyor - Gerçek I/O yükünü değerlendirirken
shared readbuffer sayısı vepg_aioskullanımı öneriliyor
Sonuç
- Postgres 18, okuma ağırlıklı iş yüklerinde performans artışına somut katkı sağlıyor
- Özellikle bulut ortamlarındaki yüksek gecikmeli diskleri kullananlar için önemli avantajlar sunabilir
- Aynı zamanda gözlem metriklerinin yorumlanması, performans ayarı ve yapılandırma uygulama biçimi konusunda yeniden öğrenme gerektiriyor
- Gelecekte Postgres 19’da asenkron yazma desteği de bekleniyor
2 yorum
Postgres gerçekten en iyisi, harika.
Hacker News yorumları
preadv2(..., RWF_NOWAIT)kullanılarak sayfa önbelleğinden asenkron okuma yapılabiliyor. Bu,io_method = workerdurumunda gecikmeyi azaltmak için faydalı olabilirNOWAITile okumayı deneyip yalnızca başarısız olursa işi worker iş parçacığına devretme yöntemi öneriliyoraio(4)özelliği üzerinde çok çalışma yapıldığı ve Linux/glibcaio'nun dezavantajlarına sahip olmaması nedeniyle nasıl çalıştığının ilginç olacağı belirtiliyorio_uringgüvenlik sorunlarına dair endişeler var; birçok Linux yöneticisinin veya dağıtımın bunu devre dışı bırakıp bırakmadığı soruluyorPGTuneile iş yüküne özel yapılandırma,PgHeroile gerçek zamanlı performans izleme vepgcronile otomatikVACUUM ANALYZEişleri yer alıyorpgbouncerkullanmayı bırakabilmeyi umdukları ifade ediliyor