PostgreSQL码农集散地

PostgreSQL 18 preview - 增加每个进程的 WAL 统计信息

PostgreSQL 18 preview - 增加每个进程的 WAL 统计信息

PostgreSQL 18 这个提交引入了一个对 PostgreSQL 监控能力的重大增强,它提供了每个后端进程的 WAL (预写式日志) 统计信息。

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=76def4cdd7c2b32d19e950a160f834392ea51744

Add WAL data to backend statistics master github/master  
author Michael Paquier <[email protected]>   
Tue, 11 Mar 2025 00:04:11 +0000 (09:04 +0900)  
committer Michael Paquier <[email protected]>   
Tue, 11 Mar 2025 00:04:11 +0000 (09:04 +0900)  
commit 76def4cdd7c2b32d19e950a160f834392ea51744  
tree 8996570dd7e4c2b4fd9aa9cbffd2fff97ec3fb01 tree  
parent 59a1592e39fed164d4d6437d62a55aef36e866a5 commit | diff  
Add WAL data to backend statistics  

This commit adds per-backend WAL statistics, providing the same  
information as pg_stat_wal, except that it is now possible to know how  
much WAL activity is happening in each backend rather than an overall  
aggregate of all the activity.  Like pg_stat_wal, the implementation  
relies on pgWalUsage, tracking the difference of activity between two  
reports to pgstats.  

This data can be retrieved with a new system function called  
pg_stat_get_backend_wal(), that returns one tuple based on the PID  
provided in input.  Like pg_stat_get_backend_io(), this is useful when  
joined with pg_stat_activity to get a live picture of the WAL generated  
for each running backend, showing how the activity is [un]balanced.  

pgstat_flush_backend() gains a new flag value, able to control the flush  
of the WAL stats.  

This commit relies mostly on the infrastructure provided by  
9aea73fc61d4, that has introduced backend statistics.  

Bump catalog version.  A bump of PGSTAT_FILE_FORMAT_ID is not required,  
as backend stats do not persist on disk.  

Author: Bertrand Drouvot <[email protected]>  
Reviewed-by: Michael Paquier <[email protected]>  
Reviewed-by: Nazir Bilal Yavuz <[email protected]>  
Reviewed-by: Xuneng Zhou <[email protected]>  
Discussion: https://postgr.es/m/Z3zqc4o09dM/[email protected]  

让我们分解一下这意味着什么以及为什么它很重要:

关键概念:

  • WAL (预写式日志): PostgreSQL 用于确保数据持久性和一致性的机制。 在任何数据修改写入主数据文件之前,它首先写入 WAL。 这允许在发生崩溃时进行恢复。
  • 后端进程 (Backend): 处理客户端连接的 PostgreSQL 进程。 每个数据库连接都会获得自己的后端进程。
  • pg_stat_wal: 一个现有的系统视图,提供关于整个数据库服务器的 WAL 活动的聚合统计信息。
  • pg_stat_activity: 一个系统视图,提供关于当前活跃的后端进程的信息,包括它们的 PID (进程 ID)。
  • pg_stat_get_backend_io(): 一个现有的系统函数,检索特定后端进程的 I/O 统计信息。
  • pgstat_flush_backend(): 一个用于将后端统计信息刷新到统计信息收集器的函数。

这个提交做了什么:

  1. 每个后端进程的 WAL 统计信息:  不再仅仅拥有聚合的 WAL 统计信息,这个提交允许你查看 每个单独的后端进程 生成了多少 WAL 活动。 这是理解工作负载分配和识别潜在瓶颈的一个重大改进。

  2. 实现: 该实现利用了现有的 pgWalUsage 结构,该结构跟踪 WAL 使用情况。 它的工作原理是定期向统计信息收集器报告两个时间点之间 WAL 活动的差异。 这与 pg_stat_wal 的工作方式类似,但现在它是按后端进程跟踪的。

  3. 新的系统函数:pg_stat_get_backend_wal(): 这个新的函数允许你检索特定后端进程的 WAL 统计信息。 你提供后端进程的 PID 作为输入,该函数返回一个包含该后端进程的 WAL 统计信息的元组。

  4. 与 pg_stat_activity 的集成: 该提交强调了将 pg_stat_get_backend_wal() 与 pg_stat_activity 连接的有用性。 这允许你获得每个运行的后端进程生成的 WAL 活动的实时视图,以及关于后端进程的其他信息(例如,它当前正在执行的查询,它连接的用户)。 这有助于你了解 WAL 活动如何在不同的连接之间分配,并识别潜在的不平衡。

  5. pgstat_flush_backend() 增强:pgstat_flush_backend() 函数已更新,增加了一个新的标志,用于控制特定后端进程的 WAL 统计信息的刷新。 这提供了对如何以及何时收集 WAL 统计信息的更精细的控制。

为什么这很重要:

  • 性能故障排除: 通过识别哪些后端进程生成了最多的 WAL 活动,你可以查明潜在的性能瓶颈。 例如,单个后端进程可能正在执行大量的写入操作,导致过多的 WAL 生成并影响整体数据库性能。
  • 工作负载分析: 了解每个后端进程的 WAL 活动允许你分析不同连接之间的工作负载分配。 这可以帮助你优化你的应用程序和数据库配置。
  • 资源监控: WAL 生成是数据库活动的关键指标。 监控每个后端进程的 WAL 活动可以提供更详细的资源利用率视图。
  • 识别有问题的查询: 通过将 WAL 活动与每个后端进程正在执行的查询(使用 pg_stat_activity)相关联,你可以识别生成过多 WAL 的查询,并可能优化它们。
  • 容量规划: 了解 WAL 生成模式有助于容量规划,并确保你的存储系统可以处理 WAL 工作负载。

总而言之,这个提交提供了一个强大的新工具,用于监控和分析 PostgreSQL 中的 WAL 活动,从而实现更精细的性能故障排除、工作负载分析和资源监控。 它允许 DBA 和开发人员更深入地了解他们的应用程序如何与数据库交互,并识别潜在的优化领域。