如何通过查询获取PostgreSQL数据库的CPU使用率?
在PostgreSQL中查询CPU使用率的方法
PostgreSQL没有像SQL Server(Azure SQL)sys.resource_stats那样直接按数据库输出CPU使用率的内置视图,但可以通过系统视图和官方扩展实现类似需求,以下是几种常用方式:
1. 按数据库统计累计CPU使用率(需启用pg_stat_statements扩展)
pg_stat_statements是PostgreSQL官方提供的扩展,用于统计所有SQL语句的执行细节,包括CPU占用时间。使用前需先完成启用:
启用扩展步骤:
- 修改PostgreSQL配置文件
postgresql.conf,添加/更新以下配置:shared_preload_libraries = 'pg_stat_statements' pg_stat_statements.track = all - 重启PostgreSQL实例
- 执行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
相关产品推荐
相关产品推荐

