暂无图片
暂无图片
4
暂无图片
暂无图片
3
暂无图片

PostgreSQL17新特性之-允许配置 SLRU 缓存大小

原创 阎书利 2024-09-13
449

除了存储在表中的常规数据之外,PostgreSQL中还需要维护某些类型的元数据。例如,如果在 PostgreSQL中使用 MultiXacts 或 NOTIFY,或者有需要保留一段时间的信息(如提交时间戳)。PostgreSQL将此信息存储在磁盘上,作为持久化的数据,但出于性能原因,PostgreSQL还会将其缓存在共享内存的SLRU专用缓存中,因为这些信息通常被频繁访问。

在某些情况下(例如,负载极大的应用程序会生成较长的事务,其中包含大量子事务(频繁的命令调用SAVEPOINT)),该缓存不够大,并且频繁使缓存中的数据失效会导致大量性能损失(和大量的CPU负载)。

所以从 PostgreSQL13 开始,在视图中提供了统计信息pg_stat_slru,有些问题通过这个视图很容易检测到,但是不能从数据库层面进行解决。

postgres<17beta1>(ConnAs[postgres]:PID[28643] 2024-05-31/19:59:31)=# select * from pg_stat_slru;
+------------------+-------------+----------+-----------+--------------+-------------+---------+-----------+-------------------------------+
|       name       | blks_zeroed | blks_hit | blks_read | blks_written | blks_exists | flushes | truncates |          stats_reset          |
+------------------+-------------+----------+-----------+--------------+-------------+---------+-----------+-------------------------------+
| commit_timestamp |           0 |        0 |         0 |            0 |           0 |      23 |         0 | 2024-05-28 11:48:07.339976+08 |
| multixact_member |           1 |        0 |         0 |            1 |           0 |      23 |         0 | 2024-05-28 11:48:07.339976+08 |
| multixact_offset |           1 |        1 |         6 |            7 |           0 |      23 |         0 | 2024-05-28 11:48:07.339976+08 |
| notify           |           0 |        0 |         0 |            0 |           0 |       0 |         0 | 2024-05-28 11:48:07.339976+08 |
| serializable     |           0 |        0 |         0 |            0 |           0 |       0 |         0 | 2024-05-28 11:48:07.339976+08 |
| subtransaction   |           9 |        0 |         0 |            7 |           0 |      23 |        23 | 2024-05-28 11:48:07.339976+08 |
| transaction      |           2 |     4016 |         6 |           19 |           0 |      23 |         0 | 2024-05-28 11:48:07.339976+08 |
| other            |           0 |        0 |         0 |            0 |           0 |       0 |         0 | 2024-05-28 11:48:07.339976+08 |
+------------------+-------------+----------+-----------+--------------+-------------+---------+-----------+-------------------------------+
(8 rows)
复制

因此在 PostgreSQL 17 中,允许配置 SLRU 缓存大小 ,把以前的单个缓存分裂成几部分,每部分的缓存,分别对应数据目录下几种持久化的文件。我们可以按需对个别参数进行调整,以解决某些问题,例如,如果你使用了很多 MultiXacts,你可能希望增加multixact_member_buffers。

[postgres@xmaster-PostgreSQL-17beta1-06 ~]$ cd $PGDATA
[postgres@xmaster-PostgreSQL-17beta1-06 data]$ ll
total 68
drwx------ 8 postgres dbgrp    76 May 31 16:22 base
-rw------- 1 postgres dbgrp    24 May 31 16:22 current_logfiles
drwx------ 2 postgres dbgrp  4096 May 31 16:24 global
drwx------ 2 postgres dbgrp    66 May 31 16:22 log
drwx------ 2 postgres dbgrp     6 May 28 11:48 pg_commit_ts
drwx------ 2 postgres dbgrp     6 May 28 11:48 pg_dynshmem
-rw------- 1 postgres dbgrp  5711 May 28 11:48 pg_hba.conf
-rw------- 1 postgres dbgrp  2640 May 28 11:48 pg_ident.conf
drwx------ 4 postgres dbgrp    68 May 31 17:53 pg_logical
drwx------ 4 postgres dbgrp    36 May 28 11:48 pg_multixact
drwx------ 2 postgres dbgrp     6 May 28 11:48 pg_notify
drwx------ 2 postgres dbgrp     6 May 31 17:48 pg_replslot
drwx------ 2 postgres dbgrp     6 May 28 11:48 pg_serial
drwx------ 2 postgres dbgrp     6 May 28 11:48 pg_snapshots
drwx------ 2 postgres dbgrp     6 May 28 20:07 pg_stat
drwx------ 2 postgres dbgrp     6 May 28 11:48 pg_stat_tmp
drwx------ 2 postgres dbgrp    18 May 28 11:48 pg_subtrans
drwx------ 2 postgres dbgrp     6 May 28 11:48 pg_tblspc
drwx------ 2 postgres dbgrp     6 May 28 11:48 pg_twophase
-rw------- 1 postgres dbgrp     3 May 28 11:48 PG_VERSION
drwx------ 4 postgres dbgrp   109 May 31 17:53 pg_wal
drwx------ 2 postgres dbgrp    18 May 28 11:48 pg_xact
-rw------- 1 postgres dbgrp    88 May 28 11:48 postgresql.auto.conf
-rw------- 1 postgres dbgrp 31177 May 28 20:07 postgresql.conf
-rw------- 1 postgres dbgrp    60 May 28 20:07 postmaster.opts
-rw------- 1 postgres dbgrp    84 May 28 20:07 postmaster.pid

复制

这几部分缓存的变量是 commit_timestamp_buffers、multixact_member_buffers、multixact_offset_buffers、notify_buffers、serializable_buffers、subtransaction_buffers 和 transaction_buffers。

  • commit_timestamp_buffers对应的持久化文件的路径是pg_commit_ts
  • multixact_member_buffers对应的持久化文件的路径是pg_multixact/members
  • multixact_offset_buffers对应的持久化文件的路径是pg_multixact/offsets
  • notify_buffer对应的持久化文件的路径是pg_notify
  • serializable_buffers对应的持久化文件的路径是pg_serial
  • subtransaction_buffers对应的持久化文件的路径是pg_subtrans
  • transaction_buffers对应的持久化文件的路径是pg_xact

其中,commit_timestamp_buffers、transaction_buffers 和subtransaction_buffers 三个设置成0时,随着shared_buffers自动扩大。三个buffers的大小如果是自动调整,则每1GB共享缓冲区使用2MB,最高可达8MB。

postgres<17beta1>(ConnAs[postgres]:PID[28643] 2024-05-31/19:34:33)=#  select name,setting,unit,category,extra_desc,context,vartype,source,min_val,max_val,enumvals,boot_val,reset_val,pending_restart from pg_settings where name like '%buffer%' and name not in('shared_buffers','temp_buffers','vacuum_buffer_usage_limit','wal_buffers','wal_decode_buffer_size');
+--------------------------+---------+------+-------------------------+--------------------------------------------------------------------------+------------+---------+---------+---------+---------+----------
+----------+-----------+-----------------+
|           name           | setting | unit |        category         |                                extra_desc                                |  context   | vartype | source  | min_val | max_val | enumvals 
| boot_val | reset_val | pending_restart |
+--------------------------+---------+------+-------------------------+--------------------------------------------------------------------------+------------+---------+---------+---------+---------+----------
+----------+-----------+-----------------+
| commit_timestamp_buffers | 32      | 8kB  | Resource Usage / Memory | Specify 0 to have this value determined as a fraction of shared_buffers. | postmaster | integer | default | 0       | 131072  |          
| 0        | 32        | f               |
| multixact_member_buffers | 32      | 8kB  | Resource Usage / Memory |                                                                          | postmaster | integer | default | 16      | 131072  |          
| 32       | 32        | f               |
| multixact_offset_buffers | 16      | 8kB  | Resource Usage / Memory |                                                                          | postmaster | integer | default | 16      | 131072  |          
| 16       | 16        | f               |
| notify_buffers           | 16      | 8kB  | Resource Usage / Memory |                                                                          | postmaster | integer | default | 16      | 131072  |          
| 16       | 16        | f               |
| serializable_buffers     | 32      | 8kB  | Resource Usage / Memory |                                                                          | postmaster | integer | default | 16      | 131072  |          
| 32       | 32        | f               |
| subtransaction_buffers   | 32      | 8kB  | Resource Usage / Memory | Specify 0 to have this value determined as a fraction of shared_buffers. | postmaster | integer | default | 0       | 131072  |          
| 0        | 32        | f               |
| transaction_buffers      | 32      | 8kB  | Resource Usage / Memory | Specify 0 to have this value determined as a fraction of shared_buffers. | postmaster | integer | default | 0       | 131072  |          
| 0        | 32        | f               |
+--------------------------+---------+------+-------------------------+--------------------------------------------------------------------------+------------+---------+---------+---------+---------+----------
+----------+-----------+-----------------+
(7 rows)

复制

各个参数详细解释如下:

commit_timestamp_buffers(integer)
指定用于缓存内容的内存量pg_commit_ts。如果指定此值时没有单位,则以块为单位,即BLCKSZ字节,通常为 8kB。默认值为0,请求shared_buffers/512 最多 1024 个块,但不少于 16 个块。此参数只能在服务器启动时设置。

transaction_buffers(integer)
指定用于缓存内容的共享内存量pg_xact。如果指定此值时没有单位,则以块为单位,即BLCKSZ字节,通常为 8kB。默认值为0,请求shared_buffers/512 最多 1024 个块,但不少于 16 个块。此参数只能在服务器启动时设置。

subtransaction_buffers(integer)
指定用于缓存内容的共享内存量pg_subtrans。如果指定此值时没有单位,则以块为单位,即BLCKSZ字节,通常为 8kB。默认值为0,请求shared_buffers/512 最多 1024 个块,但不少于 16 个块。此参数只能在服务器启动时设置。

serializable_buffers(integer)
指定用于缓存内容的共享内存量pg_serial。如果指定此值时没有单位,则以块为单位,即BLCKSZ字节,通常为 8kB。默认值为32。此参数只能在服务器启动时设置。

notify_buffers(integer)
指定用于缓存内容的共享内存量pg_notify。如果指定此值时没有单位,则以块为单位,即BLCKSZ字节,通常为 8kB。默认值为16。此参数只能在服务器启动时设置。

multixact_offset_buffers(integer)
指定用于缓存内容的共享内存量pg_multixact/offsets。如果指定此值时没有单位,则以块为单位,即BLCKSZ字节,通常为 8kB。默认值为16。此参数只能在服务器启动时设置。

multixact_member_buffers(integer)
指定用于缓存内容的共享内存量pg_multixact/members。如果指定此值时没有单位,则以块为单位,即BLCKSZ字节,通常为 8kB。默认值为32。此参数只能在服务器启动时设置。

除此之外,现在除了可以使用select pg_stat_reset_slru(null);函数重置slru的统计数据外,还可以使用pg_stat_reset_shared(NULL)重置所有共享统计数据(包含slru),或者使用pg_stat_reset_shared(‘slru’)重置统slru计数据。而PostgreSQL-16版本及以前,是不支持slru作为pg_stat_reset_shared的参数的。

//PostgreSQL-16不支持pg_stat_reset_shared('slru') postgres<16.1>(ConnAs[postgres]:PID[225677] 2024-06-03/13:56:48)=# select pg_stat_reset_shared('slru'); ERROR: unrecognized reset target: "slru" HINT: Target must be "archiver", "bgwriter", "io", "recovery_prefetch", or "wal". //PostgreSQL-17支持pg_stat_reset_shared('slru') postgres<17beta1>(ConnAs[postgres]:PID[29209] 2024-05-31/21:26:20)=# select pg_stat_reset_shared('slru'); +----------------------+ | pg_stat_reset_shared | +----------------------+ | | +----------------------+ (1 row)
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

雪狼sunny
暂无图片
6月前
评论
暂无图片 0
PostgreSQL17新特性之-允许配置 SLRU 缓存大小
6月前
暂无图片 点赞
评论
锁钥
暂无图片
6月前
评论
暂无图片 0
PostgreSQL17新特性之-允许配置 SLRU 缓存大小
6月前
暂无图片 点赞
评论
鲁鲁
暂无图片
6月前
评论
暂无图片 0
PostgreSQL17新特性之-允许配置 SLRU 缓存大小
6月前
暂无图片 点赞
评论