首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PostgreSQL 18 preview - 新增获取进程内存上下文函数

PostgreSQL 18 preview - 新增获取进程内存上下文函数

作者头像
用户4035096
发布2026-07-09 18:24:48
发布2026-07-09 18:24:48
20
举报

PostgreSQL 18 preview - 新增获取进程内存上下文函数

PostgreSQL 18 新增获取进程内存上下文函数: pg_get_process_memory_contexts . 此函数处理显示具有指定进程 ID 的 PostgreSQL 进程的内存上下文的请求。 该函数可用于向后端进程以及辅助进程发送请求。 提供了一种非侵入式的方式来监控 PostgreSQL 进程的内存使用情况,有助于识别内存泄漏、过度分配和其他内存相关的问题,从而提高数据库的稳定性和性能。

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=042a66291b04f473cbc72f95f07438abd75ae3a9

代码语言:javascript
复制
Add function to get memory context stats for processes  
author Daniel Gustafsson <dgustafsson@postgresql.org>   
Tue, 8 Apr 2025 09:06:56 +0000 (11:06 +0200)  
committer Daniel Gustafsson <dgustafsson@postgresql.org>   
Tue, 8 Apr 2025 09:06:56 +0000 (11:06 +0200)  
commit 042a66291b04f473cbc72f95f07438abd75ae3a9  
tree 730314170d4743e6dc62a128c4f3ff2f17797595 tree  
parent 15f0cb26b530b6725a37391738cfc62d4745c49b commit | diff  
Add function to get memory context stats for processes  

This adds a functionfor retrieving memory context statistics  
and information from backends as well as auxiliary processes.  
The intended usecase is cluster debugging when under memory  
pressure or unanticipated memory usage characteristics.  

When calling the function it sends a signal to the specified  
process to submit statistics regarding its memory contexts  
into dynamic shared memory.  Each memory context is returned  
in detail, followed by a cumulative total incase the number  
of contexts exceed the max allocated amount of shared memory.  
Each process is limited to use at most 1Mb memory for this.  

A summary can also be explicitly requested by the user, this  
will return the TopMemoryContext and a cumulative total of  
all lower contexts.  

In order to not block on busy processes the caller specifies  
the number of seconds during which to retry before timing out.  
In the casewhere no statistics are published within the set
timeout,  the last known statistics are returned, or NULL if
no previously published statistics exist.  This allows dash-  
board type queries to continually publish even if the target  
process is temporarily congested.  Context records contain a  
timestamp to indicate when they were submitted.  

Author: Rahila Syed <rahilasyed90@gmail.com>  
Reviewed-by: Daniel Gustafsson <daniel@yesql.se>  
Reviewed-by: Andres Freund <andres@anarazel.de>  
Reviewed-by: Tomas Vondra <tomas@vondra.me>  
Reviewed-by: Atsushi Torikoshi <torikoshia@oss.nttdata.com>  
Reviewed-by: Fujii Masao <masao.fujii@oss.nttdata.com>  
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>  
Discussion: https://postgr.es/m/CAH2L28v8mc9HDt8QoSJ8TRmKau_8FM_HKS41NeO9-6ZAkuZKXw@mail.gmail.com  

新增函数如下

https://www.postgresql.org/docs/devel/functions-admin.html#FUNCTIONS-ADMIN-SIGNAL

函数: pg_get_process_memory_contexts ( pid integer, summary boolean, timeout float ) → setof record ( name text, ident text, type text, path integer[], level integer, total_bytes bigint, total_nblocks bigint, free_bytes bigint, free_chunks bigint, used_bytes bigint, num_agg_contexts integer, stats_timestamp timestamptz )

功能:

此函数处理显示具有指定进程 ID 的 PostgreSQL 进程的内存上下文的请求。 该函数可用于向后端进程以及辅助进程发送请求。

返回记录包含每个内存上下文的扩展统计信息:

  • name (text): 内存上下文的名称。
  • ident (text): 内存上下文 ID(如果存在)。
  • type (text): 内存上下文的类型,可能的值包括:AllocSet、Generation、Slab 和 Bump。
  • path (integer[]): 内存上下文以树状模型组织,TopMemoryContext 作为根节点,所有其他内存上下文作为树中的节点。 path 显示从根节点到当前内存上下文的路径。 为了在报告期间保留内存,每个节点的子节点数量限制为 100 个,每个节点的最大深度限制为 100。 打印的路径也将限制为从 TopMemoryContext 开始的 100 个节点。
  • level (integer): 当前内存上下文在树中的级别。
  • total_bytes (bigint): 分配给此内存上下文的总字节数。
  • total_nblocks (bigint): 用于分配内存的总块数。
  • free_bytes (bigint): 此内存上下文中可用的空闲内存量。
  • free_chunks (bigint): free_bytes 对应的块数。
  • used_bytes (bigint): 当前占用的总字节数。
  • num_agg_contexts (integer): 显示的统计信息中聚合的内存上下文的数量。
  • stats_timestamp (timestamptz): 从进程中提取统计信息的时间。

参数 summary 的作用:

summarytrue 时,将显示级别 1 和 2 的内存上下文的统计信息,其中级别 1 表示根节点(即 TopMemoryContext)。 级别 2 及以下级别的上下文的统计信息是所有子上下文统计信息的聚合,其中 num_agg_contexts 指示聚合的子上下文的数量。 当 summaryfalse 时,num_agg_contexts 值为 1,表示正在显示单个统计信息。 级别限制为前 100 个上下文。

参数 timeout 的作用:

繁忙的进程可能会延迟报告内存上下文统计信息,timeout 指定等待更新统计信息的秒数。 timeout 可以指定为秒的小数部分。

函数返回值:

在收到目标进程的内存上下文统计信息后,它将结果作为每个上下文一行返回。 如果所有上下文都无法容纳在预先确定的尺寸限制内,则剩余的上下文统计信息将被聚合并显示累积总计。 num_agg_contexts 列指示显示的统计信息中聚合的上下文的数量。 当 num_agg_contexts 为 1 时,表示上下文统计信息是单独显示的。

AI 解读

这个补丁增加了一个新功能,允许用户获取数据库进程的内存上下文统计信息。

核心内容:

  • 新增函数: 提供一个函数,用于从后端进程和辅助进程中检索内存上下文的统计信息和相关信息。
  • 使用场景: 主要用于集群调试,特别是在内存压力过大或出现意外的内存使用情况时。
  • 工作原理:
    1. 发送信号: 调用该函数时,会向指定的进程发送一个信号,要求其将内存上下文的统计信息提交到动态共享内存中。
    2. 详细信息: 返回每个内存上下文的详细信息,如果上下文数量超过共享内存的最大分配量,则还会返回一个累积总计。
    3. 内存限制: 每个进程最多只能使用 1MB 的内存来存储这些统计信息。
  • 两种统计信息模式:
    • 详细模式: 返回所有内存上下文的详细信息。
    • 摘要模式: 只返回 TopMemoryContext(顶级内存上下文)以及所有下级上下文的累积总计。 用户可以显式请求摘要模式。
  • 超时机制:
    • 非阻塞: 为了避免阻塞繁忙的进程,调用者可以指定一个超时时间(秒数),函数会在超时前重试获取统计信息。
    • 返回旧数据: 如果在超时时间内没有收到统计信息,则返回上次已知的统计信息,如果之前没有发布过任何统计信息,则返回 NULL。
    • 时间戳: 上下文记录包含一个时间戳,指示其提交时间。
  • 适用场景: 这种机制允许仪表盘类型的查询持续发布统计信息,即使目标进程暂时拥塞。

总结:

这个补丁引入了一个强大的调试工具,允许管理员和开发者深入了解数据库进程的内存使用情况。 通过非阻塞的超时机制和两种统计信息模式,用户可以灵活地获取所需的内存信息,从而更好地诊断和解决内存相关的问题。 该功能对于集群环境下的内存管理和性能优化尤为重要。

更详细的解释:

  • 内存上下文 (Memory Context): PostgreSQL 使用内存上下文来管理内存分配。 每个内存上下文都有自己的分配器,可以独立于其他上下文进行分配和释放。
  • 后端进程 (Backend Process): 处理客户端连接的数据库进程。
  • 辅助进程 (Auxiliary Process): 执行后台任务的进程,例如自动清理 (autovacuum) 和统计信息收集器 (statistics collector)。
  • 动态共享内存 (Dynamic Shared Memory): 进程间共享数据的内存区域。
  • TopMemoryContext: 根内存上下文,所有其他内存上下文都是它的子上下文。
  • 仪表盘类型查询 (Dashboard-type Queries): 定期执行的查询,用于监控系统状态。

总而言之,这个补丁提供了一种非侵入式的方式来监控 PostgreSQL 进程的内存使用情况,有助于识别内存泄漏、过度分配和其他内存相关的问题,从而提高数据库的稳定性和性能。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 digoal德哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PostgreSQL 18 preview - 新增获取进程内存上下文函数
  • AI 解读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档