Topik ini membahas monitoring sehari-hari, yaitu membaca aktivitas koneksi dari pg_stat_activity, menyetel log pernyataan lambat, dan membaca indikator pembengkakan (bloat) dari penghitung tabel. Ketiganya berdiri di atas tampilan statistik bawaan, dan kebiasaan memantau yang kecil terbukti lebih berguna daripada dasbor besar yang jarang dibaca.
Blok penyiapan dataset#
# tabel uji untuk penghitung aktivitas dan baris mati
PGOPTIONS='-c client_min_messages=warning' psql -q -U postgres -d perpustakaan <<'SQL'
DROP TABLE IF EXISTS uji_bloat, peminjaman, buku, anggota, kategori CASCADE;
CREATE TABLE kategori (id SERIAL PRIMARY KEY, nama TEXT NOT NULL UNIQUE);
CREATE TABLE anggota (id SERIAL PRIMARY KEY, nama TEXT NOT NULL, email TEXT UNIQUE, bergabung DATE NOT NULL, aktif BOOLEAN NOT NULL DEFAULT TRUE);
CREATE TABLE buku (id SERIAL PRIMARY KEY, judul TEXT NOT NULL, penulis TEXT NOT NULL, tahun INTEGER NOT NULL, kategori_id INTEGER REFERENCES kategori(id));
CREATE TABLE peminjaman (id SERIAL PRIMARY KEY, anggota_id INTEGER NOT NULL REFERENCES anggota(id), buku_id INTEGER NOT NULL REFERENCES buku(id), tanggal_pinjam DATE NOT NULL, tanggal_kembali DATE);
INSERT INTO kategori (nama) VALUES ('Pemrograman'), ('Sains'), ('Sejarah'), ('Fiksi'), ('Statistika');
INSERT INTO anggota (nama, email, bergabung, aktif) VALUES ('Ali Rahman', '[email protected]', '2024-01-15', TRUE), ('Budi Santoso', '[email protected]', '2024-03-02', TRUE), ('Citra Kirana', '[email protected]', '2024-05-20', FALSE), ('Dewi Lestari', '[email protected]', '2024-08-11', TRUE), ('Eka Pratama', NULL, '2025-01-30', TRUE);
INSERT INTO buku (judul, penulis, tahun, kategori_id) VALUES ('Dasar Basis Data', 'Sari Wulandari', 2021, 1), ('Jaringan Komputer', 'Ahmad Fauzi', 2019, 1), ('Fisika untuk Pemula', 'Rina Marlina', 2020, 2), ('Kimia Organik', 'Rina Marlina', 2022, 2), ('Sejarah Nusantara', 'Bambang Wijaya', 2018, 3), ('Cerita Kota Lama', 'Nur Aisyah', 2023, 4), ('Statistika Terapan', 'Sari Wulandari', 2022, 5), ('Algoritma dan Struktur Data', 'Ahmad Fauzi', 2021, 1);
INSERT INTO peminjaman (anggota_id, buku_id, tanggal_pinjam, tanggal_kembali) VALUES (1, 1, '2025-03-01', '2025-03-15'), (1, 7, '2025-03-05', '2025-03-20'), (2, 3, '2025-03-10', NULL), (3, 5, '2025-02-20', '2025-03-01'), (2, 1, '2025-04-02', NULL), (4, 6, '2025-04-07', NULL), (5, 8, '2025-04-09', '2025-04-25'), (4, 2, '2025-05-01', NULL);
CREATE TABLE uji_bloat (id SERIAL PRIMARY KEY, nilai INTEGER NOT NULL);
INSERT INTO uji_bloat (nilai) SELECT g FROM generate_series(1, 40) g;
UPDATE uji_bloat SET nilai = nilai + 1 WHERE id <= 10;
SQLTabel uji_bloat diisi empat puluh baris lalu sepuluh barisnya diperbarui, sehingga baris matinya nyata untuk diamati pada penghitung tabel.
Membaca pg_stat_activity#
pg_stat_activity menyatakan satu baris per koneksi beserta keadaan dan pernyataan yang sedang dijalankannya, dan pembacaannya selalu disaring agar berfokus pada yang relevan. Blok berikut membaca keadaan koneksi pembacanya sendiri, nilai yang tetap di lingkungan mana pun.
# keadaan koneksi pembaca
psql -U postgres -d perpustakaan -c "SELECT state FROM pg_stat_activity WHERE pid = pg_backend_pid();" state
--------
active
(1 row)Kolom state bawaan yang sering dibaca adalah active untuk yang sedang menjalankan pernyataan dan idle untuk yang menunggu, ditambah idle in transaction yang menandai transaksi terbuka yang diam, keadaan berbahaya yang dibahas pada modul transaksi. Pemantauan koneksi lain menyertakan kolom query, usia, dan wait event, dan penyaringannya dimulai dari kolom usename serta datname agar tidak menelan seluruh lalu lintas server.
Log pernyataan lambat#
Log server adalah sisi pasif monitoring yang menyimpan jejak peristiwa, dan pengaturan yang paling bernilai untuk penalaan adalah ambang durasi pernyataan lambat melalui log_min_duration_statement. Nilai bawaannya menonaktifkan pencatatan durasi, dan penyetelan produksi memakai nilai yang mencerminkan ambang lambat aplikasinya.
Blok berikut membaca tiga pengaturan log yang menjadi titik awal penilaian, nilai bawaannya yang tetap di server mana pun.
# pengaturan log yang menjadi titik awal
psql -U postgres -d perpustakaan -tAc "SHOW logging_collector;"
psql -U postgres -d perpustakaan -tAc "SHOW log_destination;"
psql -U postgres -d perpustakaan -tAc "SHOW log_min_duration_statement;"off
stderr
-1logging_collector yang nonaktif berarti log mengalir ke penangan layanan sistem, sedangkan pengaktifannya menempatkan berkas log di bawah kendali server. Kedua pengaturan ini hanya berubah setelah server dimulai ulang, sehingga keduanya menjadi hal pertama yang diperiksa ketika laporan log tidak muncul. log_min_duration_statement diubah tanpa mulai ulang melalui reload, dan nilai milidetiknya dipilih dari durasi yang memang dikeluhkan aplikasi, bukan angka yang ditiru.
Indikator bloat dari penghitung tabel#
Baris mati menumpuk ketika UPDATE dan DELETE berjalan lebih cepat daripada autovacuum, dan ukuran tabelnya tumbuh tanpa tumbuhnya data yang hidup, keadaan yang disebut bloat. Penghitung pg_stat_user_tables memaparkannya dengan dua kolom, yaitu n_dead_tup untuk baris menunggu dibersihkan dan n_mod_since_analyze untuk perubahan sejak statistik terakhir.
# baris mati pada tabel uji
psql -U postgres -d perpustakaan <<'SQL'
SELECT n_dead_tup >= 10 AS baris_mati_terdeteksi FROM pg_stat_user_tables WHERE relname = 'uji_bloat';
DROP TABLE uji_bloat;
SQL baris_mati_terdeteksi
-----------------------
t
(1 row)
DROP TABLESepuluh pembaruan meninggalkan sepuluh baris mati yang terbaca pada penghitungnya, dan pola pemantauannya adalah menbandingkan angka itu dengan ukuran tabel hidupnya secara berkala, bukan satu kali. Angka yang tinggi menetap tidak selalu berarti bloat pada tabel yang ramai ditulis, karena autovacuum sedang bekerja, sedangkan tren menaik yang bertahan adalah sinyal penjadwalnya ditinjau.
pg_stat_statements sebagai peta query#
Peta query paling sering dipanggil beserta durasi kumulatifnya disediakan ekstensi pg_stat_statements, dan pengaktifannya menuntut pustaka prabagi melalui shared_preload_libraries diikuti mulai ulang server. Lingkungan penulisan jalur ini sengaja tidak memuatnya, sehingga blok berikut digambarkan tanpa dijalankan, dan pengetahuannya tetap penting karena ekstensi ini menjadi standar penalaan berbasis data.
# tidak-dijalankan (menuntut shared_preload_libraries dan mulai ulang server)
# aktifkan ekstensi statistik pernyataan
CREATE EXTENSION pg_stat_statements;
SELECT query, calls, total_exec_time FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10;Kolomnya menyebut berapa kali dipanggil dan berapa total durasinya, dua angka yang membedakan query cepat yang dipanggil jutaan kali daripada query lambat yang dipanggil sekali, pembedaan yang tidak terlihat pada log pernyataan lambat.
Kesalahan umum#
Kesalahan pertama adalah membaca pg_stat_activity tanpa penyaringan, sehingga layarnya penuh koneksi sistem dan pola yang dicari tenggelam di dalamnya. Kesalahan kedua adalah menyetel ambang log terlalu rendah, yang membuat log membengkak dan peristiwa penting tenggelam, sedangkan ambangnya diturunkan bertahap mengikuti penalaan.
Kesalahan ketiga adalah menilai bloat dari satu pembacaan, karena penghitungnya kumulatif sejak penghitung direset dan trennya yang bermakna. Kesalahan keempat adalah mengandalkan satu sumber, padahal pg_stat_activity menjawab apa yang terjadi sekarang, log menjawab apa yang terjadi semalam, dan pg_stat_statements menjawab siapa yang paling boros secara kumulatif.
Ringkasan#
- pg_stat_activity memaparkan setiap koneksi beserta keadaannya, dan pembacaannya selalu disaring per basis data atau role.
- log_min_duration_statement mencatat pernyataan lambat tanpa mulai ulang, sementara pengaturan penyalur log menuntutnya.
- n_dead_tup dan n_mod_since_analyze pada pg_stat_user_tables menjadi indikator awal bloat dan statistik yang basi.
- pg_stat_statements menyusun peta query paling boros secara kumulatif, dengan pengaktifannya melalui pustaka prabagi.
Referensi#
- Monitoring Database Activity — PostgreSQL Documentation — Bab induk monitoring dan tampilan statistiknya.
- pg_stat_activity — PostgreSQL Documentation — Kolom tampilan statistik dinamis.
- Error Reporting and Logging — PostgreSQL Documentation — Konfigurasi log termasuk log_min_duration_statement.