- Postgres 18, yang saat ini masih beta1, memperkenalkan dukungan I/O asinkron (Asynchronous I/O) dan secara signifikan meningkatkan kinerja baca di lingkungan cloud
- Melalui nilai konfigurasi baru
io_method, kini bisa dipilih metode worker atau io_uring selain metode sync tradisional
- Berdasarkan hasil benchmark di AWS, penggunaan
io_uring memberikan peningkatan kinerja baca disk hingga 3x
- Namun, karena sifat asinkron, interpretasi timing I/O pada analisis kueri lama (
EXPLAIN ANALYZE) menjadi lebih sulit
- View pemantauan baru (
pg_aios) dan parameter tuning (effective_io_concurrency) diperlukan untuk optimalisasi performa
Penerapan I/O asinkron di Postgres 18
- Secara tradisional, Postgres menggunakan model I/O blocking, sehingga harus menunggu sampai setiap pembacaan disk selesai
- Latensi tinggi pada storage berbasis jaringan (seperti EBS) menyebabkan bottleneck di lingkungan cloud
- I/O asinkron memungkinkan beberapa pembacaan disk diproses secara paralel, sehingga meningkatkan utilisasi CPU dan throughput keseluruhan
Persiapan awal di Postgres 17: Read Stream API
- Di Postgres 17, API
read_stream diperkenalkan untuk menstandarkan abstraksi operasi baca
- Namun, ini masih bergantung pada page cache OS dan tidak langsung tercermin di shared buffer milik Postgres sendiri
- Di Postgres 18, kini dimungkinkan pembacaan asinkron langsung, bukan sekadar kernel hint
Konfigurasi baru: io_method
- Postgres 18 menambahkan pengaturan
io_method di postgresql.conf, dengan tiga opsi berikut:
io_method = sync
- Metode sinkron yang sama seperti Postgres sebelumnya
- Menggunakan pendekatan permintaan baca preemptive berbasis
posix_fadvise()
io_method = worker (default)
- Proses worker khusus I/O membaca data secara asinkron dan mengirimkannya ke shared buffer
- Proses utama dapat terus berjalan tanpa terhenti oleh operasi baca
- Jumlah worker default adalah 3, dan bisa disesuaikan melalui pengaturan
io_workers
io_method = io_uring
- Antarmuka I/O berperforma tinggi yang tersedia di Linux kernel 5.1 ke atas
- Tanpa proses worker, pembacaan asinkron dilakukan langsung melalui shared ring buffer dengan kernel
- Membutuhkan kernel, filesystem, dan konfigurasi yang lebih baru
Benchmark kinerja I/O asinkron (berdasarkan AWS)
- Lingkungan pengujian:
- AWS c7i.8xlarge (32 vCPU, 64GB RAM)
- 100GB io2 EBS, 20,000 IOPS
- Menjalankan
SELECT COUNT(*) pada tabel berukuran 3.5GB
Perbandingan performa cold cache:
| Versi/konfigurasi |
Waktu eksekusi (ms) |
| Postgres 17 (sync) |
15,831 |
| Postgres 18 (sync) |
15,071 |
| Postgres 18 (worker) |
10,052 |
| Postgres 18 (io_uring) |
5,723 |
io_uring memberikan peningkatan performa 2.8x dibanding sync
- Sangat efektif untuk meminimalkan latensi disk di cloud
Tuning effective_io_concurrency
- Di Postgres 18, parameter ini memengaruhi jumlah permintaan read-ahead asinkron internal
- Nilai default naik dari 1 → 16, dan dikalikan dengan
io_combine_limit untuk menentukan rentang baca maksimum
- Di lingkungan cloud dengan latensi tinggi, nilai yang lebih besar bisa menguntungkan, tetapi benchmark per workload tetap diperlukan
Alat pemantauan baru: pg_aios
- Di
pg_stat_activity, operasi asinkron muncul sebagai event AioIoCompletion, sehingga analisis wait backend menjadi lebih sulit
- Untuk
io_uring, karena kernel menanganinya secara langsung, status I/O tidak terlihat dari Postgres
- Melalui view
pg_aios, detail permintaan asinkron yang sedang berlangsung dapat diperiksa
SELECT * FROM pg_aios;
- Status seperti
SUBMITTED, COMPLETED_IO, serta informasi blok target dapat diperiksa
Hal yang perlu diperhatikan: perubahan interpretasi informasi timing I/O
I/O Timings yang terlihat di EXPLAIN ANALYZE sebelumnya hanya dapat diandalkan pada metode sinkron
- Saat menggunakan
worker atau io_uring yang asinkron, interpretasi informasi timing menjadi terdistorsi karena pemrosesan paralel dan distribusi ke worker
- Untuk menilai beban I/O yang sebenarnya, disarankan menggunakan jumlah buffer
shared read dan pg_aios
Kesimpulan
- Postgres 18 memberikan kontribusi nyata pada peningkatan performa workload yang berfokus pada pembacaan
- Terutama bila menggunakan disk berlatensi tinggi di lingkungan cloud, manfaatnya bisa sangat besar
- Pada saat yang sama, dibutuhkan pembelajaran ulang tentang interpretasi metrik observabilitas, tuning performa, dan cara penerapan konfigurasi
- Di Postgres 19 mendatang, dukungan tulis asinkron juga diharapkan hadir
2 komentar
Postgres benar-benar yang terbaik, keren banget
Komentar Hacker News
preadv2(..., RWF_NOWAIT)dapat digunakan untuk melakukan pembacaan asinkron dari page cache. Ini bisa berguna untuk mengurangi latensi padaio_method = workerNOWAITdi thread utama, lalu mengalihkan ke thread pekerja hanya jika gagalaio(4)di FreeBSD, dan cara kerjanya tampaknya menarik karena tidak memiliki kekuranganaioLinux/glibcio_uring, serta pertanyaan apakah banyak admin atau distro Linux menonaktifkannyaVACUUM ANALYZEotomatis melaluipgcronpgbouncer