Saya mencoba membuat PostgreSQL untuk secara otomatis mengosongkan database saya. Saat ini saya mengkonfigurasi vakum otomatis sebagai berikut:
- autovacuum_vacuum_cost_delay = 0 # Matikan vakum berbasis biaya
- autovacuum_vacuum_cost_limit = 10000 #Max value
- autovacuum_vacuum_threshold = 50 # Nilai kerusakan
- autovacuum_vacuum_scale_factor = 0.2 # Nilai kerusakan
Saya perhatikan bahwa vakum otomatis hanya menendang ketika basis data tidak di bawah beban, jadi saya masuk ke situasi di mana terdapat lebih banyak tupel mati daripada tupel hidup. Lihat screenshot yang terlampir sebagai contoh. Salah satu tabel memiliki 23 tupel hidup tetapi 16845 tupel mati menunggu ruang hampa. Itu gila!
Vakum otomatis dimulai ketika uji coba selesai dan server basis data idle, yang bukan itu yang saya inginkan karena saya ingin pengosongan otomatis dilakukan setiap kali jumlah tupel mati melebihi 20% tupel hidup + 50, karena basis data telah dikonfigurasi Vakum otomatis ketika server idle tidak berguna bagi saya, karena server produksi diharapkan mencapai pembaruan 1000 detik / detik untuk periode yang berkelanjutan, itulah sebabnya saya perlu vakum otomatis untuk menjalankan meskipun server sedang memuat.
Apakah ada sesuatu yang saya lewatkan? Bagaimana cara memaksa vakum otomatis untuk menjalankan saat server berada di bawah beban berat?
Memperbarui
Mungkinkah ini masalah penguncian? Tabel yang dimaksud adalah tabel ringkasan yang diisi melalui pemicu setelah insert. Tabel-tabel ini dikunci dalam mode SHARE ROW EXCLUSIVE untuk mencegah penulisan bersamaan ke baris yang sama.
sumber
Meningkatkan jumlah proses autovacuum dan mengurangi naptime mungkin akan membantu. Berikut ini adalah konfigurasi untuk PostgreSQL 9.1 yang saya gunakan pada server yang menyimpan informasi cadangan dan sebagai hasilnya mendapat banyak aktivitas memasukkan.
http://www.postgresql.org/docs/current/static/runtime-config-autovacuum.html
Saya juga akan mencoba menurunkan
cost_delay
agar penyedotan debu menjadi lebih agresif.Saya juga dapat menguji autovacuuming dengan menggunakan pgbench.
http://wiki.postgresql.org/wiki/Pgbenchtesting
Contoh pertentangan tinggi:
Buat database bench_replication
Jalankan pgbench
Periksa status autovacuuming
sumber
Skrip "kualifikasi untuk autovacuum" yang ada sangat berguna, tetapi (sebagaimana dinyatakan dengan benar) tidak ada opsi khusus tabel. Ini adalah versi modifikasi yang mempertimbangkan opsi-opsi itu:
sumber