Eu me deparei com o mesmo tipo de problema. O motivo foi - algumas transações estavam ficando presas e funcionando há muito tempo. Daí em diante, a utilização da CPU aumentou para 100%. O comando a seguir ajudou a descobrir as conexões em execução por mais tempo:
SELECT max(now() - xact_start) FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'active');
Este comando mostra o tempo desde quando uma conexão está sendo executada. Este tempo não deve ser maior que uma hora. Então, matando a conexão que estava correndo de muito tempo ou preso a qualquer momento, funcionou para mim. Eu segui este post para monitorar e resolver meu problema.