Memantau performa kueri menggunakan Query Insights

Pilih versi dokumentasi:

Advanced Query Insights memungkinkan Anda mendeteksi, mendiagnosis, dan mencegah masalah performa kueri di database AlloyDB Omni. Fitur ini merekam telemetri database, termasuk statistik kueri yang dinormalisasi, peristiwa tunggu, alamat IP klien, tag, dan beban instance, serta menyimpan metrik historis selama 30 hari.

Anda dapat menggunakan Query Insights lanjutan untuk melakukan tugas berikut:

  • Identifikasi kueri dengan latensi tinggi dan penggunaan resource yang intensif dengan menganalisis waktu eksekusi, waktu I/O, waktu tunggu, aktivitas buffer bersama, dan jumlah baris.
  • Memecahkan masalah bottleneck dengan menghubungkan kueri lambat dengan peristiwa tunggu dan class peristiwa tunggu.
  • Lacak performa kueri ke komponen aplikasi tertentu dengan memberi tag pada kueri menggunakan metadata SQLCommenter.
  • Pantau kueri aktif dan transaksi terbuka secara real time, serta hentikan sesi yang bermasalah.

Sebelum memulai

Sebelum mengaktifkan Query Insights lanjutan, verifikasi persyaratan berikut:

  • Anda menjalankan instance AlloyDB Omni mandiri yang diinstal menggunakan paket RPM Linux.

  • Anda memiliki akses superuser postgres ke instance database dan akses administratif untuk memulai ulang layanan database.

  • Database alloydbadmin ada di instance Anda. AlloyDB Omni membuat database ini secara default selama inisialisasi.

Mengaktifkan Query Insights

Untuk mengaktifkan Query Insights lanjutan, ikuti langkah-langkah berikut:

  1. Hubungkan ke database postgres sebagai pengguna super postgres:

    sudo -u postgres /usr/lib/postgresql/18/bin/psql -U postgres -d postgres
  2. Periksa library yang dimuat di shared_preload_libraries, tambahkan Query Insights lanjutan ke daftar pramuat, aktifkan ekstensi, dan keluar dari psql:

    SHOW shared_preload_libraries;
    ALTER SYSTEM SET shared_preload_libraries = 'LIBRARY_1','LIBRARY_2','google_insights_v2';
    ALTER SYSTEM SET google_insights_v2.enabled = on;
    \q
    

    Ganti LIBRARY_1, LIBRARY_2, dan library tambahan yang ada dengan nama library yang ditampilkan oleh SHOW shared_preload_libraries. Sertakan setiap entri library individual dalam tanda petik tunggal, seperti 'g_stats','google_columnar_engine','google_insights_v2', dan sertakan semua library yang ada yang diperlukan oleh AlloyDB Omni agar Anda tidak menimpanya.

  3. Mulai ulang server AlloyDB Omni untuk menerapkan setelan pemuatan awal:

    sudo systemctl restart alloydbomni18
  4. Hubungkan ke database alloydbadmin sebagai superuser postgres:

    sudo -u postgres /usr/lib/postgresql/18/bin/psql -U postgres -d alloydbadmin
  5. Buat ekstensi Query Insights lanjutan di database alloydbadmin:

    CREATE EXTENSION IF NOT EXISTS google_insights_v2;
    
  6. Pastikan library dimuat, ekstensi diaktifkan, dan ekstensi google_insights_v2 diinstal di alloydbadmin:

    SHOW shared_preload_libraries;
    SHOW google_insights_v2.enabled;
    SELECT extname, extversion FROM pg_extension WHERE extname = 'google_insights_v2';
    

    Pastikan shared_preload_libraries menyertakan google_insights_v2, google_insights_v2.enabled menampilkan on, dan pg_extension menampilkan baris untuk google_insights_v2.

Parameter dimensi dan kemampuan

Di AlloyDB Omni, insight kueri lanjutan mencatat telemetri database ke dalam tabel, tampilan, dan fungsi SQL di database alloydbadmin di seluruh dimensi dan kemampuan berikut:

  • Kueri: gunakan untuk mengidentifikasi pernyataan SQL yang lambat atau menggunakan banyak resource saat latensi kueri meningkat.
  • Jenis peristiwa tunggu: digunakan untuk menentukan apakah CPU, I/O disk, atau pertentangan kunci menyebabkan bottleneck workload.
  • Peristiwa tunggu: digunakan untuk mengidentifikasi peristiwa tunggu PostgreSQL tertentu, seperti DataFileRead atau WALWrite, yang menunda eksekusi kueri.
  • Database: gunakan untuk membandingkan konsumsi resource di seluruh database logis dan mengisolasi database dengan beban tinggi pada instance bersama.
  • Pengguna dan alamat IP klien: digunakan untuk mengatribusikan beban kueri ke peran database atau alamat IP klien tertentu dan mengidentifikasi klien aplikasi yang bermasalah.
  • Tag: digunakan untuk menghubungkan beban database dengan layanan aplikasi, rute, atau tindakan ORM tertentu yang diberi tag dengan SQLCommenter.
  • Kueri aktif: digunakan untuk mendiagnosis lonjakan performa langsung, transaksi yang diblokir, dan sesi yang berjalan lama secara real time.

Saat Anda menyetel google_insights_v2.enabled ke on, AlloyDB Omni akan otomatis mengumpulkan metrik untuk kueri, jenis peristiwa tunggu, peristiwa tunggu, database, dan pengguna.

Untuk memperbarui parameter google_insights_v2.* apa pun saat runtime tanpa memulai ulang server database, jalankan ALTER SYSTEM SET dan muat ulang konfigurasi:

ALTER SYSTEM SET PARAMETER_NAME = VALUE;
SELECT pg_reload_conf();

Ganti kode berikut:

  • PARAMETER_NAME: nama parameter insight kueri lanjutan yang akan dikonfigurasi, seperti google_insights_v2.qi_track_active_queries, google_insights_v2.qi_track_tag, atau google_insights_v2.qi_track_client_address.
  • VALUE: nilai baru untuk parameter, seperti on.

Untuk deskripsi setiap parameter, tampilan kemampuan observasi yang sesuai, serta metrik dan kolom yang ditampilkan setiap tampilan, lihat Referensi insight kueri lanjutan.

Perincian waktu

Setiap tampilan observability_service_* historis tersedia dalam tiga perincian waktu:

  • Tampilan dasar (*_view): Interval pengosongan 15 detik. Gunakan tampilan ini untuk menyelidiki lonjakan atau insiden terbaru dalam 1 hingga 6 jam terakhir.
  • Penayangan tingkat kasar 1 (*_coarse_1_view): Interval gabungan 5 menit untuk 2.000 kueri teratas. Gunakan tampilan ini untuk menganalisis tren performa selama 6 hingga 24 jam.
  • Tampilan tingkat 2 kasar (*_coarse_2_view): Interval gabungan 30 menit untuk 2.000 kueri teratas. Gunakan tampilan ini untuk menganalisis tren beberapa hari hingga batas retensi 30 hari.

Tampilan historis observabilitas menyimpan semua kolom waktu eksekusi, tunggu, dan I/O dalam mikrodetik, termasuk total_execution_time, total_wait_time, total_read_time, total_write_time, dan time_spent.

Membuat kueri metrik histori performa

Hubungkan ke database alloydbadmin untuk menjalankan kueri diagnostik terhadap tampilan observabilitas historis. Untuk mengetahui informasi selengkapnya, lihat Menjalankan dan menghubungkan ke AlloyDB Omni.

Pernyataan SQL di bagian ini adalah contoh kueri untuk skenario pemecahan masalah umum di seluruh dimensi. Anda dapat menyesuaikan contoh ini, seperti mengubah jangka waktu recorded_on, memfilter menurut database atau peran tertentu, atau membuat kueri *_coarse_1_view dan *_coarse_2_view untuk analisis multi-hari, agar sesuai dengan beban kerja Anda.

Mengidentifikasi kueri berlatensi tinggi

Untuk menemukan 10 kueri yang dinormalisasi teratas dengan total waktu eksekusi tertinggi dalam satu jam terakhir, jalankan contoh kueri berikut terhadap google_insights_v2.observability_service_query_view:

SELECT
  query_id,
  database,
  username,
  left(query, 100) AS normalized_query,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us,
  sum(total_rows) AS total_rows,
  sum(total_shared_blocks_hit) AS shared_blocks_hit,
  sum(total_shared_blocks_read) AS shared_blocks_read
FROM google_insights_v2.observability_service_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY query_id, database, username, left(query, 100)
ORDER BY total_execution_time_us DESC
LIMIT 10;

Menganalisis peristiwa tunggu berdasarkan kueri

Untuk mengidentifikasi kategori peristiwa tunggu (wait_class) dan peristiwa tunggu terperinci (wait_event) yang berkontribusi paling besar terhadap waktu tunggu untuk query_id tertentu, jalankan contoh kueri berikut terhadap google_insights_v2.observability_service_wait_event_stats_by_query_view:

SELECT
  query_id,
  database,
  username,
  wait_class,
  wait_event,
  sum(count) AS wait_occurrences,
  sum(time_spent) AS total_wait_time_us
FROM google_insights_v2.observability_service_wait_event_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
  AND query_id = QUERY_ID
GROUP BY query_id, database, username, wait_class, wait_event
ORDER BY total_wait_time_us DESC;

Ganti QUERY_ID dengan nilai query_id yang ditampilkan observability_service_query_view.

Menganalisis beban IP database, pengguna, dan klien

Untuk membandingkan total waktu eksekusi, waktu tunggu, dan volume kueri di seluruh database logis dan peran database dalam satu jam terakhir, jalankan contoh kueri berikut terhadap google_insights_v2.observability_service_db_load_conn_view:

SELECT
  database,
  username,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  sum(total_wait_time) AS total_wait_time_us
FROM google_insights_v2.observability_service_db_load_conn_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY database, username
ORDER BY total_execution_time_us DESC;

Jika mengaktifkan google_insights_v2.qi_track_client_address, Anda juga dapat mengidentifikasi alamat IP klien yang terhubung yang menghasilkan waktu kueri terbanyak menggunakan contoh kueri berikut terhadap google_insights_v2.observability_service_client_address_stats_by_query_view:

SELECT
  client_address,
  username,
  database,
  query_id,
  sum(count) AS total_executions,
  sum(time_spent) AS total_time_spent_us
FROM google_insights_v2.observability_service_client_address_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY client_address, username, database, query_id
ORDER BY total_time_spent_us DESC
LIMIT 10;

Melacak performa kueri berdasarkan tag

Jika google_insights_v2.qi_track_tag ditetapkan ke on dan kueri Anda menyertakan komentar SQLCommenter, jalankan contoh kueri berikut untuk menggabungkan waktu eksekusi berdasarkan metadata tag aplikasi menggunakan google_insights_v2.observability_service_tag_view:

SELECT
  application,
  framework_name,
  framework_controller,
  framework_action,
  framework_route,
  database,
  username,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us
FROM google_insights_v2.observability_service_tag_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY
  application,
  framework_name,
  framework_controller,
  framework_action,
  framework_route,
  database,
  username
ORDER BY total_execution_time_us DESC
LIMIT 10;

Memantau kueri aktif

Saat Anda menyetel google_insights_v2.qi_track_active_queries ke on, Anda dapat memantau kueri yang sedang berjalan dan membuka transaksi secara real time dengan membuat kueri google_insights_v2.stat_activity dan google_insights_v2.stat_activity_v3 di database alloydbadmin.

Tampilan ini mengekspos koneksi klien aktif, durasi sesi dan transaksi, serta peristiwa tunggu saat ini, sekaligus mengecualikan pekerja latar belakang dan koneksi alloydbadmin.

Mengueri durasi transaksi dan sesi aktif

Untuk mengidentifikasi kueri mana yang sedang berjalan aktif di instance saat ini dan transaksi mana yang telah berjalan paling lama, jalankan contoh kueri berikut di alloydbadmin:

SELECT
  pid AS "Process ID",
  left(normalized_query, 40) AS "Query",
  state AS "Status",
  round(EXTRACT(EPOCH FROM (clock_timestamp() - backend_start))::numeric, 2) AS "Session duration (secs)",
  CASE
    WHEN xact_start IS NOT NULL
    THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - xact_start))::numeric, 2)
    ELSE NULL
  END AS "Transaction duration (secs)",
  CASE
    WHEN query_start IS NOT NULL
    THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - query_start))::numeric, 2)
    ELSE NULL
  END AS "Query duration (secs)",
  COALESCE(wait_event_type, '') AS "Wait event type",
  COALESCE(wait_event, '') AS "Wait event",
  database AS "Database",
  COALESCE(application_name, '') AS "Application name",
  username AS "Username",
  COALESCE(client_addr::text, '') AS "Client address"
FROM google_insights_v2.stat_activity_v3
WHERE state = 'active'
ORDER BY query_start ASC;

Menghentikan kueri atau transaksi yang berjalan lama

Untuk menghentikan kueri yang berjalan lama atau transaksi yang diblokir yang diidentifikasi di google_insights_v2.stat_activity_v3, teruskan ID prosesnya ke pg_terminate_backend:

SELECT pg_terminate_backend(PROCESS_ID);

Ganti PROCESS_ID dengan nilai Process ID (pid) yang ditampilkan oleh google_insights_v2.stat_activity_v3.

Menonaktifkan Query Insights lanjutan

Untuk menghentikan pengumpulan data telemetri tanpa memulai ulang instance AlloyDB Omni, tetapkan google_insights_v2.enabled ke off dan muat ulang konfigurasi:

ALTER SYSTEM SET google_insights_v2.enabled = off;
SELECT pg_reload_conf();

Untuk menghapus objek ekstensi dan data historis yang disimpan dari database alloydbadmin, hubungkan ke alloydbadmin dan hapus ekstensi:

DROP EXTENSION IF EXISTS google_insights_v2 CASCADE;

Langkah berikutnya