You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过查询获取PostgreSQL数据库的CPU使用率?

在PostgreSQL中查询CPU使用率的方法

PostgreSQL没有像SQL Server(Azure SQL)sys.resource_stats那样直接按数据库输出CPU使用率的内置视图,但可以通过系统视图和官方扩展实现类似需求,以下是几种常用方式:

1. 按数据库统计累计CPU使用率(需启用pg_stat_statements扩展)

pg_stat_statements是PostgreSQL官方提供的扩展,用于统计所有SQL语句的执行细节,包括CPU占用时间。使用前需先完成启用:

启用扩展步骤:

  1. 修改PostgreSQL配置文件postgresql.conf,添加/更新以下配置:
    shared_preload_libraries = 'pg_stat_statements'
    pg_stat_statements.track = all
    
  2. 重启PostgreSQL实例
  3. 执行SQL创建扩展:
    CREATE EXTENSION pg_stat_statements;
    

查询语句:

SELECT
  datname AS database_name,
  ROUND(SUM(total_time) / 1000, 2) AS total_cpu_seconds,
  ROUND(
    (SUM(total_time) / 1000) / EXTRACT(EPOCH FROM (NOW() - pg_postmaster_start_time())) * 100,
    2
  ) AS average_cpu_percent
FROM pg_stat_statements
JOIN pg_database ON pg_stat_statements.dbid = pg_database.oid
GROUP BY datname
ORDER BY average_cpu_percent DESC;
  • total_time:该数据库所有SQL语句累计占用的CPU毫秒数,转换为秒便于阅读
  • average_cpu_percent:从PostgreSQL启动到当前,该数据库占用的CPU百分比平均值

2. 统计当前活跃连接的CPU使用率(无需额外扩展)

通过pg_stat_activity视图统计当前正在执行的查询的CPU消耗,适合快速查看实时负载:

SELECT
  datname AS database_name,
  COUNT(*) AS active_connections,
  ROUND(
    SUM(EXTRACT(EPOCH FROM (NOW() - query_start))) / EXTRACT(EPOCH FROM (NOW() - pg_postmaster_start_time())) * 100,
    2
  ) AS realtime_cpu_percent
FROM pg_stat_activity
WHERE state = 'active' -- 仅统计正在执行的查询
GROUP BY datname
ORDER BY realtime_cpu_percent DESC;
  • 该查询基于查询执行时长估算CPU使用率,结果为近似值,适合实时排查场景

3. 统计整个PostgreSQL实例的CPU使用率

如果需要查看实例整体的CPU占用情况,可直接查询系统级统计视图:

SELECT
  ROUND(
    (1 - (cpu_idle::numeric / (cpu_user + cpu_system + cpu_idle + cpu_iowait))) * 100,
    2
  ) AS instance_cpu_usage_percent
FROM pg_stat_os_sysinfo;
  • cpu_user:用户进程占用CPU时间
  • cpu_system:系统内核占用CPU时间
  • cpu_idle:空闲CPU时间
  • cpu_iowait:等待IO的CPU时间

内容的提问来源于stack exchange,提问作者Ali Rida Hussein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:15:29