Bagikan melalui


Memecahkan masalah penggunaan CPU yang tinggi di Azure Database for PostgreSQL - Server Fleksibel

BERLAKU UNTUK: Azure Database for PostgreSQL - Server Fleksibel

Artikel ini menunjukkan kepada Anda cara mengidentifikasi akar penyebab pemanfaatan CPU yang tinggi dengan cepat, dan kemungkinan tindakan perbaikan untuk mengontrol pemanfaatan CPU saat menggunakan server fleksibel Azure Database for PostgreSQL.

Dalam artikel ini, Anda akan mempelajari:

  • Tentang panduan pemecahan masalah untuk mengidentifikasi dan mendapatkan rekomendasi untuk mengurangi akar penyebabnya.
  • Tentang alat untuk mengidentifikasi pemanfaatan CPU yang tinggi seperti Azure Metrics, Penyimpanan Kueri, dan pg_stat_statements.
  • Cara mengidentifikasi akar penyebab, seperti kueri yang berjalan lama dan koneksi total.
  • Cara mengatasi pemanfaatan CPU yang tinggi dengan menggunakan tabel Explain Analyze, Connection Pooling, dan Vacuuming.

Panduan Pemecahan Masalah

Menggunakan panduan pemecahan masalah fitur yang tersedia di portal server fleksibel Azure Database for PostgreSQL, kemungkinan akar penyebab dan rekomendasi untuk mengurangi skenario CPU tinggi dapat ditemukan. Cara menyiapkan panduan pemecahan masalah untuk menggunakannya, ikuti panduan pemecahan masalah penyiapan.

Alat untuk mengidentifikasi pemanfaatan CPU yang tinggi

Pertimbangkan alat ini untuk mengidentifikasi pemanfaatan CPU yang tinggi.

Azure Metrics

Azure Metrics adalah titik awal yang baik untuk memeriksa pemanfaatan CPU untuk tanggal dan periode tertentu. Metrik memberikan informasi tentang durasi waktu pemanfaatan CPU yang tinggi. Bandingkan grafik IOP Tulis, IOP Baca, Throughput Baca, dan Throughput Tulis dengan pemanfaatan CPU 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.

Query Store

Penyimpanan Kueri secara otomatis mengambil riwayat kueri dan statistik runtime, dan menyimpannya untuk Anda tinjau. Ini mengiris data berdasarkan 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. Untuk panduan langkah demi langkah, lihat Penyimpanan Kueri.

pg_stat_statements

Ekstensi pg_stat_statements membantu mengidentifikasi kueri yang menghabiskan waktu di server.

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 secara umum tinggi, berikut ini 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 juga merupakan masalah lain yang mungkin 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 1 ORDER BY 1;

Mengatasi pemanfaatan CPU tinggi

Gunakan Explain Analyze, PG Bouncer, pengumpulan koneksi, dan hentikan transaksi jangka panjang untuk mengatasi pemanfaatam CPU tinggi.

Gunakan Jelaskan Analisis

Setelah Anda mengetahui kueri yang berjalan untuk waktu yang lama, gunakan EXPLAIN untuk menyelidiki lebih lanjut kueri dan menyesuaikannya.
Untuk informasi lebih lanjut tentang perintah EXPLAIN, tinjau Paket Explain.

PGBouncer dan pengumpulan koneksi

Dalam situasi di mana ada banyak koneksi diam atau banyak koneksi, yang menggunakan CPU mempertimbangkan penggunaan pengumpul koneksi seperti PgBouncer.

Untuk detail lebih lanjut tentang PgBouncer, tinjau:

Pengumpul Koneksi

Praktik Terbaik

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

Menghentikan transaksi jangka panjang

Anda dapat mempertimbangkan untuk menghentikan transaksi jangka panjang sebagai opsi.

Untuk mengakhiri PID sesi, Anda harus mendeteksi PID 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 mengakhiri 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_name>;