Memecahkan masalah penggunaan CPU yang tinggi dari layanan postgres dan postmaster?

28

Saya menggunakan mesin berbasis open source (RHEL 6.2) yang menjalankan perangkat lunak SIEM. Ketika saya menjalankan topperintah, saya melihat postgresdan postmasterkeduanya dengan penggunaan CPU 96%. Apakah ada cara untuk menunjuk atau melihat apa yang menyebabkan layanan ini menumpuk?

asadz
sumber
2
"RHCE 6.2"? Apakah maksud Anda "RHEL 6.2"? Saya berasumsi postgressyaitu postgresdan Anda baru saja disalin dengan tangan.
Craig Ringer

Jawaban:

30

Anda dapat mencocokkan ID backend Postgres tertentu dengan ID proses sistem menggunakan pg_stat_activitytabel sistem.

SELECT pid, datname, usename, query FROM pg_stat_activity;bisa menjadi titik awal yang baik.
Setelah Anda tahu pertanyaan apa yang sedang berjalan, Anda dapat menyelidiki lebih lanjut ( EXPLAIN/ EXPLAIN ANALYZE; periksa kunci, dll.)

voretaq7
sumber
apakah ini permintaan yang tepat, saya tidak terlalu terbiasa dengan db karena saya orang kedua yang bekerja pada siem, pernyataan pilih Anda, apakah saya harus memberinya pid dari perintah atas?
asadz
1
@ asadz tidak, itu terpotong (diperbaiki sekarang) - Jika Anda memiliki PID tertentu dan ingin melihat apa yang sedang berjalan Anda dapat mengisolasi mereka dengan WHEREklausa, tetapi jika Anda tidak memiliki sejumlah besar PID itu sama saja mudah mencari melalui output penuh. Manual Postgres memiliki detail tambahan tentang apa yang bisa Anda dapatkanpg_stat_activity , serta tabel statistik-pengumpul lainnya (yang dapat membantu Anda jika masalah Anda bukan permintaan pengguna).
voretaq7
ketika saya menjalankan query ini, tidak ada PID yang harus saya curigai
Fendi Tri Cahyono
Terima kasih atas petunjuknya, baru-baru ini saya menemukan masalah serupa dan menemukan alasannya dengan menggunakan SELECT * FROM pg_stat_activity;
Yao
14

Saya mengalami masalah yang sama. Postgresql diatur pada AWS RDS dan memiliki utilisasi cpu 100% bahkan setelah meningkatkan instance. Saya debugged dengan metode yang ditunjukkan di sini dan salah satu metode yang bekerja untuk saya.

Saya memeriksa permintaan yang berjalan untuk waktu yang paling lama dan mengetahui bahwa permintaan tertentu macet dan berjalan sejak lebih dari 3-4 jam. Untuk memeriksa sejak berapa lama kueri berjalan, jalankan perintah berikut:

SELECT max(now() - xact_start) FROM pg_stat_activity
                               WHERE state IN ('idle in transaction', 'active');

Jika ini lebih dari satu jam, maka ini masalahnya. Matikan koneksi yang sudah berjalan lama dan batasi usia maks koneksi dari sisi aplikasi.

Ajeet Khan
sumber
8

Jika ini benar-benar kepala kantor pos menggunakan semua CPU itu, maka Anda kemungkinan memiliki masalah pertikaian kunci, mungkin karena sangat tinggi max_connections. Pertimbangkan untuk menurunkan max_connectionsdan menggunakan pooler koneksi jika ini masalahnya.

Kalau tidak: Detail, silakan. Output penuh top -b -n 1untuk memulai.

Craig Ringer
sumber
ini masuk akal; karena siem digunakan oleh analis untuk meminta banyak data bolak-balik; apakah ada cara saya dapat memeriksa status kunci; atau kondisi yang dikaitkan dengannya; ?
asadz