Sebagai pelengkap singkat untuk artikel
Cobalah membuat analog ASH untuk PostgreSQL .
Tantangan
Anda perlu menautkan riwayat tampilan pg_stat_statemenets, pg_stat_activity. Akibatnya, menggunakan riwayat paket eksekusi dari tabel layanan log_query, Anda bisa mendapatkan banyak informasi berguna untuk digunakan dalam menyelesaikan insiden kinerja dan mengoptimalkan kueri.
Peringatan
Karena kebaruan topik dan periode pengujian yang tidak lengkap, artikel mungkin mengandung kesalahan. Kritik dan komentar sangat didorong dan diharapkan.
Masukkan data
Tabel history_pg_stat_activity Tabel Pg_stat_db_queries CREATE TABLE pg_stat_db_queries ( database_id integer , queryid bigint , query text , max_time double precision );(
Tampilan terwujud dari mvw_pg_stat_queries CREATE MATERIALIZED VIEW public.mvw_pg_stat_queries AS SELECT t.queryid, t.max_time, t.query FROM public.dblink('LINK1'::text, 'SELECT queryid , max_time , query FROM pg_stat_statements WHERE dbid=(SELECT oid FROM pg_database WHERE datname=current_database() ) AND max_time >= 0 '::text) t(queryid bigint, max_time double precision, query text) WITH NO DATA;
Tabel log_query CREATE TABLE log_query ( id integer , queryid bigint , query_md5hash text , database_id integer , timepoint timestamp without time zone , query text , explained_plan text[] , plan_md5hash text , explained_plan_wo_costs text[] , plan_hash_value text , ip text, port text , pid integer );
Algoritma umum
Perbarui tabel pg_stat_db_queries
Refresh Lihat Bahan mvw_pg_stat_queries CREATE OR REPLACE FUNCTION refresh_pg_stat_queries_list( database_id int) RETURNS BOOLEAN AS $$ DECLARE result BOOLEAN ; database_rec record ; BEGIN SELECT * INTO database_rec FROM endpoint e JOIN database d ON e.id = d.endpoint_id WHERE d.id = database_id ; IF NOT database_rec.is_need_monitoring THEN RAISE NOTICE 'NO NEED MONITORING FOR database_id=%',database_id; return TRUE ; END IF ; EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||database_rec.host||' port=5432 dbname='||database_rec.name|| ' user='||database_rec.s_name||' password='||database_rec.s_pass|| ' '')'; REFRESH MATERIALIZED VIEW mvw_pg_stat_queries ; PERFORM dblink_disconnect('LINK1'); RETURN result; END $$ LANGUAGE plpgsql;
Isi tabel pg_stat_db_queries CREATE OR REPLACE FUNCTION refresh_pg_stat_db_queries( ) RETURNS BOOLEAN AS $$ DECLARE result BOOLEAN ; database_rec record ; pg_stat_rec record ; BEGIN TRUNCATE pg_stat_db_queries; FOR database_rec IN SELECT * FROM database d LOOP IF NOT database_rec.is_need_monitoring THEN RAISE NOTICE 'NO NEED MONITORING FOR database_id=%',database_rec.id; CONTINUE ; END IF ; PERFORM refresh_pg_stat_queries_list( database_rec.id ) ; FOR pg_stat_rec IN SELECT * FROM mvw_pg_stat_queries LOOP INSERT INTO pg_stat_db_queries ( database_id , queryid , query , max_time ) VALUES ( database_rec.id , pg_stat_rec.queryid , pg_stat_rec.query , pg_stat_rec.max_time); END LOOP; END LOOP; RETURN TRUE; END $$ LANGUAGE plpgsql;
Akibatnya, tabel berisi teks kueri yang dinormalisasi, kueri, waktu eksekusi kueri maksimum saat ini (digunakan untuk pemantauan).
Mengisi log_query dan membentuk riwayat rencana eksekusi.
Teks permintaan aktual diambil dari file log. Log file dari host target ke host pemantauan di bagian, skrip bash, cron. Untuk menghemat ruang dan karena sepele tugas menyalin file teks dari host ke host, skrip tidak disediakan.
Mem-parsing file log dan mengekstraksi teks kueri Sebagai hasilnya, tabel berisi teks permintaan aktual, rencana eksekusi, nilai hash dari rencana eksekusi, nilai hash teks permintaan.
Isi nilai queryid di tabel history_pg_stat_activity
perbarui_history_pg_stat_activity_by_queryid.sql Akibatnya, tabel berisi nilai kueri yang sesuai dengan nilai kueri.
Ringkasan
Dengan menautkan pg_stat_activity, pg_stat_statements, log_query, Anda bisa mendapatkan banyak informasi berguna tentang permintaan, khususnya:
- Sejarah rencana implementasi.
- Riwayat permintaan waktu CPU.
- Minta riwayat tunggu.
Data dan banyak laporan tambahan akan dijelaskan di artikel berikutnya.
Pengembangan
Dengan menautkan informasi yang tersedia dengan riwayat tampilan pg_locks, Anda dapat memperoleh informasi tentang kunci spesifik mana yang menunggu permintaan dan yang paling penting, proses (permintaan) mana yang menahan kunci ini.
Solusi untuk masalah ini akan dijelaskan pada artikel selanjutnya. Sekarang pengujian dan penyempurnaan sedang berlangsung.