PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengukur Statistik Pos Pemeriksaan PostgreSQL

Pos pemeriksaan dapat menjadi hambatan utama pada instalasi PostgreSQL yang banyak menulis. Langkah pertama untuk mengidentifikasi masalah di area ini adalah memantau seberapa sering masalah itu terjadi, yang baru-baru ini menambahkan antarmuka yang lebih mudah digunakan ke database.

Pos pemeriksaan adalah operasi pemeliharaan berkala yang dilakukan database untuk memastikan bahwa semua yang disimpan dalam cache di memori telah disinkronkan dengan disk. Idenya adalah bahwa setelah Anda menyelesaikannya, Anda dapat menghilangkan kekhawatiran tentang entri lama yang ditempatkan ke dalam log tulis-depan database. Itu berarti lebih sedikit waktu untuk pulih setelah crash.
Masalah dengan pos pemeriksaan adalah pos pemeriksaan bisa sangat intensif, karena untuk menyelesaikannya memerlukan penulisan setiap bit data yang diubah dalam cache buffer database ke disk. Ada sejumlah fitur yang ditambahkan ke PostgreSQL 8.3 yang memungkinkan Anda memantau overhead pos pemeriksaan dengan lebih baik, dan menurunkannya dengan menyebarkan aktivitas dalam jangka waktu yang lebih lama. Saya menulis artikel panjang tentang perubahan yang disebut Checkpoints dan Background Writer yang membahas apa yang berubah, tetapi ini adalah bacaan yang cukup kering.
Yang mungkin ingin Anda ketahui adalah cara memantau pos pemeriksaan pada sistem produksi Anda, dan cara mengetahuinya jika itu terjadi terlalu sering. Meskipun keadaan telah membaik, "lonjakan pos pemeriksaan" di mana I/O disk menjadi sangat berat masih dimungkinkan bahkan dalam versi PostgreSQL saat ini. Dan itu tidak membantu bahwa konfigurasi default disetel untuk ruang disk yang sangat rendah dan pemulihan kerusakan yang cepat daripada kinerja. Parameter checkpoint_segments yang merupakan salah satu masukan tentang seberapa sering checkpoint terjadi defaultnya adalah 3, yang memaksa checkpoint hanya setelah 48 MB penulisan.
Anda dapat mengetahui frekuensi checkpoint dengan dua cara. Anda dapat mengaktifkan log_checkpoints dan melihat apa yang terjadi di log. Anda juga dapat menggunakan tampilan pg_stat_bgwriter, yang memberikan hitungan masing-masing dari dua sumber untuk pos pemeriksaan (perjalanan waktu dan penulisan yang terjadi) serta statistik tentang berapa banyak pekerjaan yang mereka lakukan.
Masalah utama dengan membuatnya lebih mudah untuk lakukan adalah bahwa sampai saat ini, tidak mungkin untuk mengatur ulang penghitung di dalam pg_stat_bgwriter. Itu berarti Anda harus mengambil snapshot dengan stempel waktu di atasnya, tunggu beberapa saat, ambil snapshot lain, lalu kurangi semua nilai untuk mendapatkan statistik yang berguna dari data. Itu menyebalkan.
Cukup menyakitkan saya menulis tambalan untuk membuatnya lebih mudah. Dengan versi pengembangan database saat ini, Anda sekarang dapat memanggil pg_stat_reset_shared('bgwriter') dan mengembalikan semua nilai ini ke 0 lagi. Ini memungkinkan mengikuti praktik yang dulu umum di PostgreSQL. Sebelum 8.3, ada parameter bernama stats_reset_on_server_start yang bisa Anda aktifkan. Itu mengatur ulang semua statistik internal server setiap kali Anda memulainya. Itu berarti Anda dapat memanggil fungsi pg_postmaster_start_time() yang praktis, membandingkan dengan waktu saat ini, dan selalu memiliki penghitungan yang akurat dalam hal operasi/detik dari setiap statistik yang tersedia di sistem.
Ini masih tidak otomatis, tetapi sekarang bahwa mengatur ulang bagian-bagian yang dibagikan ini dimungkinkan, Anda dapat melakukannya sendiri. Kunci pertama adalah mengintegrasikan kliring statistik ke dalam urutan startup server Anda. Skrip seperti ini akan berfungsi:


pg_ctl start -l $PGLOG -w
psql -c "select pg_stat_reset();"
psql -c "select pg_stat_reset_shared('bgwriter');"

Perhatikan "-w" pada perintah start di sana–yang akan membuat pg_ctl menunggu sampai server selesai dimulai sebelum kembali, yang sangat penting jika Anda ingin segera mengeksekusi pernyataan yang menentangnya.
Jika sudah selesai itu, dan waktu mulai server Anda pada dasarnya sama seperti ketika penulis latar belakang memulai pengumpulan statistik, Anda sekarang dapat menggunakan kueri menyenangkan ini:


SELECT
total_checkpoints,
seconds_since_start / total_checkpoints / 60 AS minutes_between_checkpoints
FROM
(SELECT
EXTRACT(EPOCH FROM (now() - pg_postmaster_start_time())) AS seconds_since_start,
(checkpoints_timed+checkpoints_req) AS total_checkpoints
FROM pg_stat_bgwriter
) AS sub;

Dan dapatkan laporan sederhana tentang seberapa sering pos pemeriksaan terjadi di sistem Anda. Outputnya terlihat seperti ini:


total_checkpoints           | 9
minutes_between_checkpoints | 3.82999310740741

Apa yang Anda lakukan dengan informasi ini adalah menatap interval waktu rata-rata dan melihat apakah itu tampak terlalu cepat. Biasanya, Anda ingin pos pemeriksaan terjadi tidak lebih dari setiap lima menit, dan pada sistem yang sibuk, Anda mungkin perlu mendorongnya hingga sepuluh menit atau lebih untuk memiliki harapan untuk mengikutinya. Dengan contoh ini, setiap 3,8 menit mungkin terlalu cepat–ini adalah sistem yang membutuhkan checkpoint_segments menjadi lebih tinggi.
Menggunakan teknik ini untuk mengukur interval checkpoint memungkinkan Anda mengetahui apakah Anda perlu meningkatkan parameter checkpoint_segments dan checkpoint_timeout secara berurutan untuk mencapai tujuan itu. Anda dapat menghitung angka secara manual sekarang, dan setelah 9.0 dikirimkan, itu adalah sesuatu yang dapat Anda pertimbangkan untuk dibuat sepenuhnya otomatis – selama Anda tidak keberatan statistik Anda hilang setiap kali server dimulai ulang.
Ada beberapa cara menarik lainnya untuk menganalisis data yang disediakan penulis latar untuk Anda di pg_stat_bgwriter, tetapi saya tidak akan memberikan semua trik saya hari ini.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Mengubah Pengguna menjadi Pengguna Super di PostgreSQL

  2. Di mana log PostgreSQL di macOS?

  3. Kesalahan Umum Saat Memigrasikan Database PostgreSQL Dari Lokal ke AWS RDS

  4. PostgreSQL 13:Jangan biarkan slot membunuh yang utama

  5. Opsi Failover Cluster Basis Data Lengkap Multi-Cloud untuk PostgreSQL