Gesaan
Pertanyaan laporan pengeluaran PostgreSQL 18, imbasan timbunan bitmap (bitmap heap scans), dan vacuum dibatasi oleh kependaman storan. Reka satu pelan untuk menilai dan melancarkan I/O tak segerak (AIO) secara selamat: pilih io_method, tala konkurensi, sahkan pg_stat_io dan pg_aios, asingkan kekangan CPU, cache, dan storan, serta undurkan perubahan (roll back) apabila kependaman merosot.
Perkara yang diuji oleh penemu duga
Ini menguji eksperimen prestasi pangkalan data dan disiplin perubahan persekitaran pengeluaran. AIO boleh mengeluarkan berbilang bacaan secara serentak, tetapi ia tidak menjadikan setiap beban kerja lebih pantas. Jawapan yang mantap menerangkan worker, io_uring, dan sync, menggunakan beban kerja dan statistik yang boleh diulang, serta mentakrifkan ambang pengunduran dan bukannya memaksimumkan setiap parameter.
Soalan penjelasan
- Adakah laluan utama merupakan imbasan berurutan (sequential scans), imbasan timbunan bitmap, vacuum, atau carian titik rawak (random point lookups)?
- Adakah storan merupakan NVMe tempatan, storan blok rangkaian, atau volum kontena, dan adakah kernel menyokong
io_uring? - Adakah matlamatnya adalah daya pemprosesan (throughput), kependaman P95, masa penyiapan vacuum, atau penggunaan CPU yang lebih rendah?
- Bolehkah replika bacaan atau tika bayang (shadow instance) menjalankan ujian tersebut, dan adakah perubahan parameter pemulaan memerlukan but semula?
Rangka kerja 30 saat
Bina garis dasar untuk kependaman, daya pemprosesan, CPU, penantian I/O, dan tempoh vacuum di bawah keadaan data dan cache yang tetap. Kemudian rangkumi pemilihan kaedah (worker/io_uring/sync), kawalan konkurensi (effective_io_concurrency, io_max_concurrency, io_workers), dan kebolehcerapan/pengunduran (pg_stat_io, pg_aios, dan pintu kawalan SLO). Buat keputusan daripada eksperimen berperingkat, bukan daripada satu larian pantas semata-mata.
Reka bentuk langkah demi langkah
1. Wujudkan garis dasar yang setanding
Tetapkan versi minor PostgreSQL 18, data, indeks, statistik, dan konkurensi klien yang seragam. Ukur cache sejuk dan cache panas secara berasingan, rekodkan EXPLAIN (ANALYZE, BUFFERS, WAL), pg_stat_io, kependaman cakera, dan CPU. Asingkan imbasan berurutan, imbasan timbunan bitmap, dan vacuum supaya kemerosotan prestasi tidak hilang dalam nilai purata.
2. Pilih kaedah I/O
io_method=worker menggunakan pekerja I/O PostgreSQL dan merupakan garis dasar keserasian yang konservatif. io_method=io_uring memerlukan binaan liburing dan sokongan kernel. io_method=sync ialah laluan kawalan dan pengunduran. Sahkan binaan dan kebenaran, kemudian jalankan setiap kaedah untuk beberapa pusingan pada beban kerja yang sama.
3. Kawal konkurensi
effective_io_concurrency dan maintenance_io_concurrency menyediakan petunjuk konkurensi untuk sesi dan penyelenggaraan. io_max_concurrency mengehadkan operasi serentak bagi setiap proses, manakala io_workers diguna pakai pada kaedah pekerja (worker). Tingkatkan secara beransur-ansur dan perhatikan baris gilir storan, P95, dan CPU; jangan sesekali menetapkan setiap nilai kepada tahap maksimumnya secara lalai.
4. Tafsirkan isyarat
Gunakan pg_stat_io untuk membandingkan bacaan, penulisan, dan penantian mengikut bahagian belakang (backend), objek, dan operasi. Gunakan pg_aios untuk memeriksa pemegang (handles) yang sedang disediakan, dilaksanakan, atau diselesaikan. Jika pertanyaan menjadi lebih pantas manakala baris gilir storan dan kependaman ekor (tail latency) meningkat, daya pemprosesan telah ditukar ganti dengan perebutan sumber (contention). Jika paparan tidak berubah, beban kerja mungkin tidak menggunakan laluan yang disokong atau didominasi oleh hit cache.
5. Reka bentuk eksperimen dan kapasiti
Pada replika atau tika bayang, tingkatkan konkurensi klien secara berperingkat dan bandingkan daya pemprosesan, P95/P99, CPU, kedalaman I/O, dan tunggakan vacuum. Sertakan had lonjakan (burst limits), amplifikasi bacaan, dan jiran bising (noisy neighbors) untuk storan rangkaian. Peruntukkan kapasiti untuk WAL, titik semak (checkpoints), autovacuum, dan sandaran.
6. Tetapkan pintu kawalan pelancaran dan pengunduran
Takrifkan ambang faedah dan kemerosotan bagi setiap beban kerja: P95 tidak boleh merosot, baris gilir storan tidak boleh kekal tepu, dan tunggakan vacuum tidak boleh bertambah. Lancarkan kepada set tika yang kecil dalam tetingkap penyelenggaraan dengan pemilik yang dinamakan. Melepasi ambang akan menukar kembali kepada sync atau nilai konkurensi sebelumnya serta memelihara statistik sebelum/selepas.
7. Nyatakan had dan langkah seterusnya
PostgreSQL 18 AIO menambah baik laluan yang boleh mengeluarkan I/O serentak; ia tidak menggantikan indeks, pelan pertanyaan, penalaan cache, atau peningkatan storan. Rekodkan kernel, pilihan binaan, io_method, dan snapshot parameter, serta ulangi garis dasar pelbagai beban kerja semasa naik taraf sebelum meluaskan pelancaran.
Contoh jawapan yang mantap
“Saya akan menggunakan replika bacaan dengan data, statistik, dan keadaan cache yang tetap untuk mengukur imbasan berurutan, imbasan timbunan bitmap, dan vacuum dalam keadaan sejuk dan panas, sambil merekodkan EXPLAIN BUFFERS, pgstatio, kependaman cakera, dan CPU. Saya akan bermula dengan worker, membandingkan iouring hanya selepas mengesahkan liburing dan sokongan kernel, dan mengekalkan sync sebagai kawalan dan pengunduran. Saya akan meningkatkan effectiveioconcurrency dan maintenanceioconcurrency secara beransur-ansur sambil mengehadkan iomaxconcurrency dan ioworkers, memerhatikan baris gilir storan dan P99. pg_aios mengesahkan pemegang yang aktif. Hanya beban kerja yang melepasi pintu kawalan kependaman/daya pemprosesan tanpa ketepuan baris gilir akan menerima pelancaran kenari (canary); kemerosotan kependaman ekor atau tunggakan akan mengundurkan tetapan kembali kepada sync.”
Mod kegagalan biasa
- Memaksimumkan konkurensi tanpa garis dasar atau bajet kapasiti.
- Menganggap io_uring tersedia tanpa pemeriksaan binaan dan kernel.
- Memerhatikan kependaman purata sambil mengabaikan P95/P99, baris gilir, dan tunggakan vacuum.
- Menganggap pg_aios sebagai bukti bahawa setiap pertanyaan menggunakan AIO, mengabaikan laluan yang disokong dan hit cache.
- Meniadakan pintu kawalan kenari, pemilikan, ambang batas, dan pengunduran ke sync.
Arah tindakan susulan
Bilakah anda akan memilih worker berbanding io_uring?
Pilih worker apabila binaan atau kernel kekurangan sokongan liburing atau apabila laluan keserasian yang konservatif diperlukan, kemudian buat keputusan berdasarkan pengukuran.
Mengapa ujian cache sejuk dan panas perlu diasingkan?
Ujian cache panas kebanyakannya menggunakan CPU dan memori; cache sejuk mendedahkan konkurensi storan dan kependaman ekor. Mencampurkan kedua-duanya akan menyembunyikan kesan AIO yang sebenar.
Adakah effective_io_concurrency yang lebih besar sentiasa lebih baik?
Tidak. Konkurensi yang berlebihan boleh meningkatkan perebutan storan dan kependaman ekor global, jadi kalibrasikannya mengikut peranti dan beban kerja.
Bagaimanakah anda membuktikan faedah pada vacuum?
Kekalkan kembung (bloat), tupel mati (dead tuples), dan tetingkap penyelenggaraan secara malar, kemudian bandingkan masa penyiapan, penantian I/O, kesan kunci (lock impact), dan tunggakan.
Adakah pg_aios sumber pemantauan jangka panjang?
Ia memaparkan pemegang semasa dan berguna untuk diagnosis atau sampel; analisis trend memerlukan pgstatio, metrik sistem, dan label beban kerja.
Rujukan
PostgreSQL 18 “Release Notes”, “Resource Consumption Configuration”, dan “pg_aios System View”.