Ruang lingkup aplikasi
- ApsaraDB RDS for PostgreSQL
Saat menggunakan ApsaraDB RDS for PostgreSQL, Anda mungkin mengalami pemanfaatan CPU yang tinggi atau bahkan mencapai 100%. Artikel ini menjelaskan penyebab umum dan solusi dengan menganalisis skenario tipikal di mana pemanfaatan CPU mencapai 100%.
Perhatikan hal-hal berikut:
Ketika mengalami pemanfaatan CPU 100%, periksa apakah terjadi lonjakan koneksi aktif selama jam sibuk bisnis dan apakah sumber daya cadangan database tidak mencukupi. Verifikasi bahwa jumlah koneksi aktif jauh lebih besar dari biasanya saat masalah terjadi. Untuk instance ApsaraDB RDS for PostgreSQL, Anda dapat melihat perubahan koneksi ke database di bagian pemantauan dan peringatan di Konsol ApsaraDB RDS. Untuk koneksi aktif saat ini, Anda dapat terhubung ke database dan menjalankan pernyataan berikut untuk menanyakan:
select count( * ) from pg_stat_activity where state not like '%idle';
Lacak Pernyataan SQL Lambat
Jika jumlah koneksi aktif berada dalam rentang normal, penyebabnya mungkin adalah banyaknya pernyataan SQL lambat. Dalam kasus ini, gunakan log query lambat ApsaraDB RDS untuk mengidentifikasi pernyataan yang memakan waktu. Namun, ketika masalah ini terjadi, seluruh sistem menjadi macet dan semua pernyataan SQL melambat. Oleh karena itu, sulit untuk mengidentifikasi pernyataan lambat yang menyebabkan masalah karena banyak pernyataan lambat mungkin tercatat dalam log. Berikut adalah metode untuk melacak pernyataan SQL lambat:
create extension pg_stat_statements;
select pg_stat_reset();
select pg_stat_statements_reset();
select * from pg_stat_statements order by total_time desc limit 5; select * from pg_stat_statements order by shared_blks_hit+shared_blks_read desc limit 5; select datname,
usename,
client_addr,
application_name,
state,
backend_start,
xact_start,
xact_stay,
query_start,
query_stay,
replace(query, chr(10), ' ') as query
from
(select pgsa.datname as datname,
pgsa.usename as usename,
pgsa.client_addr client_addr,
pgsa.application_name as application_name,
pgsa.state as state,
pgsa.backend_start as backend_start,
pgsa.xact_start as xact_start,
extract(epoch
from (now() - pgsa.xact_start)) as xact_stay,
pgsa.query_start as query_start,
extract(epoch
from (now() - pgsa.query_start)) as query_stay,
pgsa.query as query
from pg_stat_activity as pgsa
where pgsa.state != 'idle'
and pgsa.state != 'idle in transaction'
and pgsa.state != 'idle in transaction (aborted)') idleconnections
order by query_stay desc
limit 5; select * from pg_stat_user_tables where n_live_tup > 100000 and seq_scan > 0 order by seq_tup_read desc limit 10; select * from pg_stat_activity where query ilike '%<table name>%' and query_start - now() > interval '10 seconds';
Catatan: Anda juga dapat menjalankan pernyataan berikut untuk menemukan query yang terkait dengan tabel menggunakan Plugin pg_stat_statements:
select * from pg_stat_statements where query ilike '%<table>%'order by shared_blks_hit+shared_blks_read desc limit 3;
Tangani Pernyataan SQL Lambat
Untuk pernyataan SQL lambat yang diperoleh dengan menggunakan metode sebelumnya seperti yang ditunjukkan dalam contoh berikut, Anda harus menghentikan tugas mereka untuk memulihkan bisnis Anda.
select pg_cancel_backend(pid) from pg_stat_activity where query like '%<query text>%' and pid != pg_backend_pid();
select pg_terminate_backend(pid) from pg_stat_activity where query like '%<query text>%' and pid != pg_backend_pid();
Jika pernyataan SQL lambat tersebut penting untuk bisnis Anda, optimalkan dengan menggunakan metode berikut:
ANALYZE [$Table] atau VACUUM ANALYZE [$Table] di tabel yang terkait dengan pernyataan SQL lambat yang diperoleh untuk memperbarui statistik tabel. Dengan cara ini, rencana eksekusi query dapat lebih akurat. Untuk meminimalkan dampak pada bisnis Anda, jalankan pernyataan tersebut selama jam-jam sepi bisnis.
Catatan: [$Table] mewakili tabel yang terkait dengan pernyataan SQL lambat.
explain [$Query_Text]
explain (buffers true, analyze true, verbose true) [$Query_Text]
Catatan: [$Query_Text] mewakili file atau pernyataan SQL.