tencent cloud

云数据库 PostgreSQL

进程监控

Download
聚焦模式
字号
最后更新时间: 2026-08-12 11:22:11

功能背景

在一些通用场景下,客户应用不仅需要数据库实例整体的监控信息,同时也需要通过实例中的进程监控信息来判断业务健康度,从而进一步做业务逻辑的决策。典型的,在 SaaS 场景中,用户的一个租户单独使用一个数据库实例的 database。业务方通过监控连接到 database 进程的资源使用情况,能进一步判断租户当前的健康度等情况。

环境准备

进程监控功能由扩展 tencentdb_system_stat 提供,使用前需要在目标数据库中创建该扩展。
1. 创建扩展:
postgres=> CREATE EXTENSION IF NOT EXISTS tencentdb_system_stat;
CREATE EXTENSION
2. 验证扩展已安装:
postgres=> SELECT extname, extversion FROM pg_extension WHERE extname = 'tencentdb_system_stat';
extname | extversion
--------------------------+------------
tencentdb_system_stat | 1.1
(1 row)

查看进程监控

进程监控数据通过系统视图 tencentdb_process_system_usage 对外暴露。该视图以每个进程为一行,展示进程的 CPU 使用率与内存占用量。

查询所有进程的监控数据

postgres=> SELECT * FROM tencentdb_process_system_usage;
pid | usename | datname | backend_type | query | cpu_usage | memory_bytes
-------+----------+----------+------------------------------+----------------------------------------------------+-----------+--------------
52962 | | | walwriter | | 0 | 7573504
52964 | postgres | | logical replication launcher | | 0 | 6135808
52957 | | | io worker | | 0 | 5771264
52960 | | | background writer | | 0 | 5890048
52959 | | | checkpointer | | 0 | 23977984
52956 | | | io worker | | 0 | 12611584
52958 | | | io worker | | 0 | 4235264
26706 | root | postgres | client backend | SELECT * FROM tencentdb_process_system_usage; | 0 | 17186816
(8 rows)

视图字段说明

字段名
类型
说明
pid
integer
进程号
usename
name
用户名
datname
name
数据库名
backend_type
text
进程类型,如 client backend、autovacuum worker、walwriter、checkpointer、background writer、logical replication launcher 等
query
text
当前正在执行的 SQL 语句(后台进程为空)
cpu_usage
real
当前采样期间的 CPU 使用率,取值范围 0.0 ~ 1.0(即 0% ~ 100%)
memory_bytes
bigint
当前采样期间的内存占用量(RSS),单位:字节
说明:
cpu_usage 为采样瞬间的 CPU 使用率,是两次采样之间该进程消耗的 CPU 时间占系统总 CPU 时间的比例(以1个 CPU 核为基准)。单核满载时 cpu_usage = 1.0,多核并行场景下可能大于1.0。
memory_bytes 为进程的 RSS(Resident Set Size),即该进程实际驻留在物理内存中的页面总量,包含共享内存(如 shared_buffers),不含 swap。
视图每次查询会阻塞约 sampling_interval 毫秒以完成两次采样差值计算,默认约1秒。

按条件过滤进程

您可以使用标准 SQL 过滤条件查看感兴趣的子集。
按 CPU 使用率排序,定位高 CPU 消耗的进程
postgres=> SELECT pid, usename, datname, backend_type, cpu_usage,
pg_size_pretty(memory_bytes) AS memory
FROM tencentdb_process_system_usage
ORDER BY cpu_usage DESC
LIMIT 5;
pid | usename | datname | backend_type | cpu_usage | memory
---------+----------+----------+------------------------------+-----------+----------
52962 | | | walwriter | 0 | 7396 kB
52959 | | | checkpointer | 0 | 22 MB
26706 | root | postgres | client backend | 0 | 17 MB
52956 | | | io worker | 0 | 12 MB
52964 | postgres | | logical replication launcher | 0 | 5992 kB
(5 rows)
按内存使用量排序,定位高内存消耗的进程
postgres=> SELECT pid, usename, datname, backend_type,
pg_size_pretty(memory_bytes) AS memory, cpu_usage
FROM tencentdb_process_system_usage
ORDER BY memory_bytes DESC
LIMIT 5;
pid | usename | datname | backend_type | memory | cpu_usage
---------+----------+----------+------------------------------+----------+-----------
52959 | | | checkpointer | 22 MB | 0
26706 | root | postgres | client backend | 17 MB | 0
52956 | | | io worker | 12 MB | 0
52962 | | | walwriter | 7396 kB | 0
52964 | postgres | | logical replication launcher | 5992 kB | 0
(5 rows)
按进程类型分组统计
postgres=> SELECT backend_type, count(*) AS cnt
FROM tencentdb_process_system_usage
GROUP BY backend_type
ORDER BY cnt DESC;
backend_type | cnt
------------------------------+-----
io worker | 3
walwriter | 1
autovacuum launcher | 1
client backend | 1
background writer | 1
checkpointer | 1
logical replication launcher | 1
(7 rows)
按数据库名筛选特定租户的进程
postgres=> SELECT pid, usename, backend_type, cpu_usage,
pg_size_pretty(memory_bytes) AS memory,
substring(query, 1, 60) AS query_preview
FROM tencentdb_process_system_usage
WHERE datname = 'your_database';
pid | usename | datname | backend_type | cpu_usage | memory | query_preview
-----+---------+---------+--------------+-----------+--------+---------------
(0 rows)

参数说明

tencentdb_system_stat 扩展提供以下参数,用于控制采样行为。该参数属于 sighup 级别,修改后需通过控制台生效,不支持在 SQL 会话中通过 SET 命令修改。

tencentdb_system_stat.sampling_interval

属性
含义
CPU 使用率的采样间隔
类型
integer
单位
毫秒(ms)
默认值
1000
取值范围
100 ~ 2147483
说明:
每次查询 tencentdb_process_system_usage 视图时,内核会对每个进程进行两次 CPU 时间采样,两次采样之间间隔本参数指定的时长。CPU 使用率通过两次采样的差值除以间隔时长计算得出。间隔越短,采样结果越能反映瞬时负载,查询本身的等待时间也越短。间隔越长,采样结果越平滑,但查询耗时同步增加。对延迟敏感的场景可以适当降低该值。
修改方式:登录腾讯云控制台 → 云数据库 PostgreSQL → 实例管理 → 参数设置,搜索参数 tencentdb_system_stat.sampling_interval,修改为目标值并保存。详细操作请参见 设置实例参数

使用场景

SaaS 多租户场景中的租户负载分析

在 SaaS 多租户架构中,不同租户连接到不同的 database,您可以通过按 datname 过滤并汇总 CPU 与内存指标,评估每个租户的资源消耗情况:
postgres=> SELECT datname, count(*) AS connection_count,
sum(cpu_usage) AS total_cpu,
pg_size_pretty(sum(memory_bytes)::bigint) AS total_memory
FROM tencentdb_process_system_usage
WHERE datname IS NOT NULL
GROUP BY datname
ORDER BY sum(memory_bytes) DESC;

定位慢查询的会话资源消耗

结合 query 字段,可以快速了解当前正在执行的 SQL 对应哪个会话、消耗了多少 CPU 和内存:
postgres=> SELECT pid, usename, datname, cpu_usage,
pg_size_pretty(memory_bytes) AS memory,
substring(query, 1, 100) AS query_preview
FROM tencentdb_process_system_usage
WHERE query IS NOT NULL AND query <> ''
ORDER BY memory_bytes DESC;

常见问题

Q:查询视图时为什么会有1 秒的延迟?

A:CPU 使用率通过两次采样计算差值得出,两次采样之间的等待时间由 tencentdb_system_stat.sampling_interval 参数决定(默认 1000 毫秒)。这是正常行为。如果对延迟敏感,可将该参数调小,但过小的采样间隔会降低 CPU 使用率计算的精度。

Q:为什么某些进程的 usenamedatname 为空?

A:tencentdb_process_system_usage 视图通过内连接 pg_stat_activity 关联进程信息,如果某个进程不在 pg_stat_activity 中(如 walwritercheckpointer 等系统后台进程),这些字段会显示为空。如需包含所有进程,请使用 tencentdb_process_system_usage_all 视图。

Q:memory_bytes 是否包含共享内存(shared_buffers)?

A:包含。memory_bytes 为进程的 RSS,包含了该进程映射的所有常驻物理内存页,包括 PostgreSQL 共享缓冲区等共享内存段。

Q:为什么有的进程没有被监控到?

A:在一次采样期间,只有采样结束时刻仍然存活的进程才会被统计到。以下图为例,进程1和进程5不会被统计到。



帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈