暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译文] Postgres 14 亮点 - 内存转储

原创 Atsushi Torikoshi 2021-08-18
480

此视图称为pg_backend_memory_contexts,将显示尝试访问此视图的会话的当前内存使用情况。这种功能的实现可能在内核外,因为可以访问低级 API 和内存结构结构,主要是通过 src/include/nodes/memnodes.h,但很高兴能够访问此工具不依赖于外部模块。

逻辑从 TopMemoryContext 开始,向下级联到每个子内存上下文,调用一组回调来获取每个内存上下文的所有统计信息,以便为每个内存上下文打印一个元组。有两个额外的事情可以追踪上下文的金字塔结构:每个子上下文的深度级别和父上下文的名称。登录主机后,还可以使用调试器获取内存统计信息,但在我们无法登录主机的云时代,这可能会很烦人。在这里聚合这些数据也是一个不错的奖励。

请注意,默认情况下,此视图的访问权限仅限于超级用户,但可以授予其他角色。由于 CacheMemoryContext 跟踪目录和关系缓存,因此这很有用的一个领域是可以跟踪当前连接的会话使用的缓存量:

=# SELECT pg_size_pretty(sum(used_bytes)) AS cache_size FROM pg_backend_memory_contexts WHERE parent = 'CacheMemoryContext'; cache_size ------------ 124 kB (1 row)

然而,这是有限的,因为这不会提供监视其他会话活动的可能性。这是该区域的第二个功能变得有用的地方,该功能允许在日志中转储其他会话的内存使用情况,这要归功于此提交

commit: 43620e328617c1f41a2a54c8cee01723064e3ffa author: Fujii Masao <fujii@postgresql.org> date: Tue, 6 Apr 2021 13:44:15 +0900 Add function to log the memory contexts of specified backend process. Commit 3e98c0bafb added pg_backend_memory_contexts view to display the memory contexts of the backend process. However its target process is limited to the backend that is accessing to the view. So this is not so convenient when investigating the local memory bloat of other backend process. To improve this situation, this commit adds pg_log_backend_memory_contexts() function that requests to log the memory contexts of the specified backend process. [...] Thanks to Tatsuhito Kasahara, Andres Freund, Tom Lane, Tomas Vondra, Michael Paquier, Kyotaro Horiguchi and Zhihong Yu for the discussion. Bump catalog version. Author: Atsushi Torikoshi Reviewed-by: Kyotaro Horiguchi, Zhihong Yu, Fujii Masao Discussion: https://postgr.es/m/0271f440ac77f2a4180e0e56ebd944d1@oss.nttdata.com

根据此函数中的硬编码超级用户检查,请注意此函数的执行不能授予其他角色,因为这可能会导致 DOS 并通过强制写入与内存上下文相关的统计信息来膨胀日志收集器希望后端为每个上下文提供一个日志级别的条目。

=# SELECT pg_log_backend_memory_contexts(6597); pg_log_backend_memory_contexts -------------------------------- t (1 row)

如果在向进程发送信号时找到进程,则返回的布尔状态将为真。当 PID 引用可能不存在的进程或非 PostgreSQL 进程时,返回 False。如果可以找到进程但无法发送将内存使用情况转储到日志的信号,则同样返回 False。打印的每个 LOG 条目存储与前一个函数相同的信息,但请注意,这不包括直接父项的名称。相反,条目是有序的。例如,这里是上一个函数运行的摘录,显示了缓存的开头:

日志:级别:1;CacheMemoryContext:8 个块共 1048576 个;480024 免费(1 块);568552 使用日志:级别:2;索引信息:2 个区块共 2048 个;496 个免费(1 块);1552 使用:pg_db_role_setting_databaseid_rol_index

最后要注意的是,这些日志不会返回给客户端,它们只是打印在服务器日志中。

原文地址:https://paquier.xyz/postgresql-2/postgres-14-memory-dumps/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论