对 postgres 和 postmaster 服务的 CPU 使用率高进行故障排除?

asa*_*adz 40 postgresql

我正在使用基于开源 (RHEL 6.2) 的机器运行 SIEM 软件。当我运行该top命令时,我看到postgrespostmaster两者的 CPU 使用率都为 96%。有没有办法确定或查看导致这些服务堆积的原因?

vor*_*aq7 41

您可以使用pg_stat_activity系统表将特定的 Postgres 后端 ID 与系统进程 ID 匹配。

SELECT pid, datname, usename, query FROM pg_stat_activity;可以是一个很好的起点。
一旦您知道正在运行哪些查询,您就可以进一步调查(EXPLAIN/ EXPLAIN ANALYZE;检查锁等)


小智 23

我遇到了同样的问题。postgresql 是在 AWS RDS 上设置的,即使在增加实例后,它的 CPU 利用率仍为 100%。我使用此处显示的方法进行了调试,其中一种方法对我有用。

我检查了运行时间最长的查询,发现某些查询卡住了并且运行了 3-4 个小时以上。要检查查询运行了多长时间,请运行以下命令:

SELECT max(now() - xact_start) FROM pg_stat_activity
                               WHERE state IN ('idle in transaction', 'active');
Run Code Online (Sandbox Code Playgroud)

如果这超过一个小时,那就是问题所在。终止长时间运行的连接并从应用程序端限制连接的最大年龄。


Cra*_*ger 10

如果这确实是使用所有 CPU 的 postmaster,那么您可能会遇到锁争用问题,可能是由于max_connections. max_connections如果是这种情况,请考虑降低和使用连接池。

否则:请详细说明。top -b -n 1一开始就全力输出。


Kaj*_*nus 6

您可以使用pg_stat_statements
     https://www.postgresql.org/docs/current/pgstatstatements.html

首先,pg_stat_activity(来自其他答案)是很好的建议——我认为有时这还不够?它仅显示当前活动,但是如果有许多快速查询,但持续时间不够长,以至于它们看起来很有趣pg_stat_activity怎么办?但是,当它们很多时,它们是否仍然会导致 CPU 使用率高?

然后你可以使用pg_stat_statements

pg_stat_statements 记录针对您的数据库运行的查询,从中去除许多变量,然后保存有关查询的数据,例如花费了多长时间,以及底层读/写发生了什么。

(来自这篇博文:最有用的 Postgres 扩展: pg_stat_statements

在这里我用它来找出我自己的CPU使用率意外高的原因:

\x

select 
  (total_time / 1000 / 3600) as total_hours,
  (total_time / 1000) as total_seconds,
  (total_time / calls) as avg_millis, 
  calls num_calls,
  query 
from pg_stat_statements 
order by 1 desc limit 10;


-[ RECORD 1 ]-+-------------------------
total_hours   | 0.128210291016666
total_seconds | 461.557047659998
avg_millis    | 9.06506889111474
num_calls     | 50916
query         | select p.site_id, p.page_id, p.version current_version, h.page_version cached_version from  ...
-[ RECORD 2 ]-+------------------------
total_hours   | 0.0586912504452778
total_seconds | 211.288501603
avg_millis    | 4.14966517279101
num_calls     | 50917
query         | select p.site_id, p.page_id ... from ...
:
:
Run Code Online (Sandbox Code Playgroud)

你注意到上面的东西了吗?— 热门查询很快:0.009 和 0.004 秒。但是他们被多次调用。