top
命令时,我看到postgres
和postmaster
的CPU使用率均为96%。有没有办法查明或查看导致这些服务堆积的原因?#1 楼
您可以使用pg_stat_activity
系统表将特定的Postgres后端ID与系统进程ID匹配。SELECT pid, datname, usename, query FROM pg_stat_activity;
可以作为一个很好的起点。一旦知道正在运行什么查询,就可以进一步调查(
EXPLAIN
/ EXPLAIN ANALYZE
;检查锁等)评论
这是确切的查询吗,我对db不太熟悉,因为我是从事siem的第二个人,您的select语句,我是否必须从top命令提供pid?
–asadz
2013年6月7日在21:02
@asadz不,它已被截断(现已修复)-如果您具有特定的PID,并且想查看它们正在运行,则可以使用WHERE子句将其隔离,但是如果您没有大量的PID,那只是易于搜索完整的输出。 Postgres手册提供了有关pg_stat_activity以及其他统计信息收集器表的更多详细信息(如果您的问题不是用户查询,则可以为您提供帮助)。
–voretaq7
13年6月7日在21:11
当我执行此查询时,我不必怀疑任何PID
– Fendi Tri Cahyono
19年3月14日在23:28
感谢您提供的线索,最近我遇到了类似的问题,并通过使用SELECT * FROM pg_stat_activity;找出了原因。
–姚
19年8月26日在9:51
#2 楼
我有同样的问题。 PostgreSQL是在AWS RDS上设置的,即使增加实例后,CPU利用率仍为100%。我使用此处显示的方法进行了调试,其中一种方法对我有用。我检查了查询运行时间最长的时间,得知某些查询由于超过3个而被卡住并正在运行-4个小时。要检查查询运行了多少时间,请运行以下命令:
SELECT max(now() - xact_start) FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'active');
如果超过一个小时,那么这就是问题所在。终止长期运行的连接并从应用程序端限制连接的最长期限。
#3 楼
如果这确实是使用所有CPU的邮局局长,则可能是由于max_connections
很高导致锁争用问题。如果是这种情况,请考虑降低max_connections
并使用连接池。否则,请详细说明。
top -b -n 1
的完整输出开始。评论
这是有道理的;由于分析师使用siem来回查询大量数据;有什么方法可以检查锁定状态吗?或归因于此的条件; ?
–asadz
2013年6月9日上午7:01
#4 楼
您可以使用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 ...
:
:
你在上面注意到了吗? —热门查询很快:0.009和0.004秒。但是他们被打了很多遍。
评论
“ RHCE 6.2”?您是说“ RHEL 6.2”吗?我认为postgress是postgres,而您只是手工复制了它。