Bagikan melalui


Memecahkan masalah pemanfaatan CPU tinggi di Azure Database for PostgreSQL

Artikel ini menjelaskan cara mengidentifikasi akar penyebab pemanfaatan CPU yang tinggi. Ini juga menyediakan kemungkinan tindakan perbaikan untuk mengontrol pemanfaatan CPU saat menggunakan Azure Database for PostgreSQL.

Dalam artikel ini, Anda dapat mempelajari cara:

  • Tentang panduan pemecahan masalah untuk mengidentifikasi dan mendapatkan rekomendasi untuk mengurangi akar penyebabnya.
  • Tentang alat untuk mengidentifikasi pemanfaatan CPU tinggi seperti Metrik Azure, penyimpanan kueri, dan pg_stat_statements.
  • Cara mengidentifikasi akar penyebab, seperti kueri yang berjalan lama dan koneksi total.
  • Cara mengatasi pemanfaatan CPU tinggi dengan menggunakan EXPLAIN ANALYZE, pengumpulan koneksi, dan tabel vakum.

Panduan Pemecahan Masalah

Menggunakan panduan Pemecahan Masalah, Anda dapat mengidentifikasi akar kemungkinan penyebab skenario CPU tinggi, dan dapat membaca rekomendasi untuk mengurangi masalah yang ditemukan.

Untuk mempelajari cara menyiapkan dan menggunakan panduan pemecahan masalah, ikuti panduan pemecahan masalah penyiapan.

Alat untuk mengidentifikasi pemanfaatan CPU yang tinggi

Pertimbangkan penggunaan daftar alat berikut untuk mengidentifikasi pemanfaatan CPU yang tinggi.

Metrik di Azure

Azure Metrics adalah titik awal yang baik untuk memeriksa pemanfaatan CPU untuk periode tertentu. Metrik memberikan informasi tentang sumber daya yang digunakan selama periode di mana pemanfaatan CPU tinggi. Bandingkan grafik IOP Tulis, IOP Baca, Byte Throughput Baca/Detik, dan Byte Throughput Tulis/Detik dengan CPU persen, untuk mengetahui waktu ketika beban kerja menyebabkan CPU tinggi.

Untuk pemantauan proaktif, Anda dapat mengonfigurasi peringatan pada metrik. Untuk panduan langkah demi langkah, lihat Metrik Azure.

Penyimpanan kueri

Penyimpanan kueri secara otomatis mengambil riwayat kueri dan statistik runtime, dan menyimpannya untuk tinjauan Anda. Ini mengiris data menurut waktu, sehingga Anda dapat melihat pola penggunaan temporal. Data untuk semua pengguna, database, dan kueri disimpan dalam database bernama azure_sys di instans server fleksibel Azure Database for PostgreSQL.

Penyimpanan kueri dapat menghubungkan informasi peristiwa tunggu dengan statistik run time kueri. Gunakan penyimpanan kueri untuk mengidentifikasi kueri yang memiliki konsumsi CPU tinggi selama periode yang diinginkan.

Untuk informasi selengkapnya, lihat penyimpanan kueri.

pg_stat_statements

pg_stat_statements Ekstensi ini membantu mengidentifikasi kueri yang menghabiskan waktu di server. Untuk informasi selengkapnya tentang ekstensi ini, lihat dokumentasinya.

Rata-rata atau waktu eksekusi rata-rata

Untuk Postgres versi 13 dan versi di atasnya, gunakan pernyataan berikut untuk melihat lima pernyataan SQL teratas berdasarkan waktu eksekusi rata-rata atau rata-rata:

SELECT userid::regrole, dbid, query, mean_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 5;

Total waktu eksekusi

Jalankan pernyataan berikut untuk melihat lima pernyataan SQL teratas berdasarkan total waktu eksekusi.

Untuk Postgres versi 13 dan di atasnya, gunakan pernyataan berikut untuk melihat lima pernyataan SQL teratas berdasarkan total waktu eksekusi:

SELECT userid::regrole, dbid, query
FROM pg_stat_statements
ORDER BY total_exec_time
DESC LIMIT 5;

Mengidentifikasi akar penyebab

Jika tingkat konsumsi CPU tinggi secara umum, yang berikut ini bisa menjadi kemungkinan akar penyebabnya:

Transaksi jangka panjang

Transaksi jangka panjang dapat menghabiskan sumber daya CPU yang dapat menyebabkan pemanfaatan CPU yang tinggi.

Kueri berikut membantu mengidentifikasi koneksi yang berjalan paling lama:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() AND state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

Jumlah total koneksi dan jumlah koneksi menurut status

Sejumlah besar koneksi ke database mungkin juga menyebabkan peningkatan pemanfaatan CPU dan memori.

Kueri berikut memberikan informasi tentang jumlah koneksi menurut status:

SELECT state, count(*)
FROM  pg_stat_activity
WHERE pid <> pg_backend_pid()
GROUP BY state
ORDER BY state ASC;

Mengatasi pemanfaatan CPU tinggi

Gunakan EXPLAIN ANALYZE, pertimbangkan untuk menggunakan pengumpul koneksi PgBouncer bawaan, dan hentikan transaksi jangka panjang untuk menyelesaikan pemanfaatan CPU yang tinggi.

Menggunakan EXPLAIN ANALYZE

Setelah Anda mengetahui kueri yang menggunakan lebih banyak CPU, gunakan EXPLAIN ANALYZE untuk menyelidiki dan menyetelnya lebih lanjut.

Untuk informasi selengkapnya tentang perintah EXPLAIN ANALYZE, tinjau dokumentasinya.

PgBouncer, pengumpul koneksi bawaan

Dalam situasi di mana ada banyak koneksi berumur pendek, atau banyak koneksi yang tetap menganggur selama sebagian besar hidupnya, pertimbangkan untuk menggunakan pengumpul koneksi seperti PgBouncer.

Untuk informasi selengkapnya tentang PgBouncer, lihat kumpulan koneksi dan praktik terbaik penanganan koneksi dengan PostgreSQL

Azure Database for PostgreSQL menawarkan PgBouncer sebagai solusi pengumpulan koneksi bawaan. Untuk mengetahui informasi selengkapnya, lihat PgBouncer.

Menghentikan transaksi jangka panjang

Anda dapat mempertimbangkan untuk menghentikan transaksi jangka panjang sebagai opsi.

Untuk mengakhiri PID sesi, Anda perlu menemukan PID-nya dengan menggunakan kueri berikut:

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() AND state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

Anda juga dapat memfilter menurut properti lain seperti usename (nama pengguna), datname (nama database), dll.

Setelah Anda memiliki PID sesi, Anda dapat mengakhirinya menggunakan kueri berikut:

SELECT pg_terminate_backend(pid);

Memantau statistik vakum dan tabel

Menjaga statistik tabel tetap terbaru membantu meningkatkan performa kueri. Pantau apakah autovacuuming reguler sedang dilakukan.

Kueri berikut membantu mengidentifikasi tabel yang perlu dikosongkan:

SELECT schemaname,relname,n_dead_tup,n_live_tup,last_vacuum,last_analyze, last_autovacuum,last_autoanalyze
FROM pg_stat_all_tables
WHERE n_live_tup > 0;

Kolom last_autovacuum dan last_autoanalyze memberikan tanggal dan waktu ketika tabel terakhir kali dikosongkan atau dianalisis secara otomatis. Jika tabel tidak dikosongkan secara teratur, ambil langkah-langkah untuk menyetel autovacuum.

Untuk informasi selengkapnya tentang pemecahan masalah dan pengaturan autovacuum, lihat Pemecahan Masalah Autovacuum.

Solusi jangka pendek adalah melakukan analisis vakum manual dari tabel di mana kueri lambat terlihat:

VACUUM ANALYZE <table>;