我正在使用基于开源 (RHEL 6.2) 的机器运行 SIEM 软件。当我运行该top命令时,我看到postgres和postmaster两者的 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一开始就全力输出。
您可以使用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 秒。但是他们被多次调用。
| 归档时间: |
|
| 查看次数: |
138384 次 |
| 最近记录: |