Miałem podobny problem. Było to spowodowane - niektóre transakcje blokowały się i działały przez długi czas. W ten sposób wykorzystanie procesora przez cały czas było na poziomie 100%. Następujące polecenie pomogło znaleźć połączenia działające najdłużej:
SELECT max(now() - xact_start) FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'active');
To polecenie pokazuje czas od kiedy połączenie jest uruchomione. Ten czas nie powinien być dłuższy niż godzina. Tak więc zabicie połączenia, które działało od dłuższego czasu lub zostało zablokowane w dowolnym momencie, zadziałało dla mnie. Śledziłem ten post za monitorowanie i rozwiązywanie mojego problemu. Post zawiera wiele przydatnych poleceń do monitorowania tej sytuacji.