调优PostgreSQL 14和更早版本的统计信息收集器

PostgreSQL15移除了统计收集器,但在之前的版本中,通过将stats_temp_directory设置到RAMFS或TEMPFS可提高效率。这减少了IO开销并使统计更准确。调整stats_temp_directory的位置和大小取决于数据库的活动和配置参数。tempfs是更常用的选项,因为它允许动态调整大小且显示为常规文件系统。通过ALTERSYSTEM命令和SIGHUP信号,可以不重启PostgreSQL就更新此设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PostgreSQL 15的一项重大改进:PostgreSQL 15:统计收集器不见了?

虽然对这个即将到来的改进高兴,但我们可以在以前的版本中看到一些关于“效率低下”的评论。

这让我意识到,尽管调整stats collector的特性是官方文档和建议的一部分,而且过去有许多关于它的博客帖子,但我很少看到有人在实践中尝试调整它。所以我觉得值得再提醒一下。

PostgreSQL 14及更早版本的选项

简单地说,将生成stats文件的目录(stats_temp_directory)移动到RAMFS或TEMPFS(基于RAM的文件系统)中的某个位置,可以节省IO开销,同时使stats collector更加高效和准确。

PostgreSQL文档也正式建议这样做以减少影响。

为了更好的性能,stats_temp_directory可以指向基于RAM的文件系统,减少了物理I/O需求。当服务器完全关闭时,统计数据的永久副本存储在pg_stat子目录,以便可以在服务器重新启动后保留统计信息。

参考:PostgreSQL文档

需要多大的空间?

stats文件的当前位置可以通过检查stats_temp_directory来查看

在Red Hat克隆上,默认位置将在数据目录中。

postgres=# show stats_temp_directory ;
 stats_temp_directory 
----------------------
 pg_stat_tmp

而在Debian/Ubuntu上,它会在/var/run/postgresql,例如:

postgres=# show stats_temp_directory ;
          stats_temp_directory           
-----------------------------------------
 /var/run/postgresql/14-main.pg_stat_tmp
 

确定了位置,stat文件一般大小不会高于几百MB。大小取决于数据库和数据库中对象(表和索引)的数量。更重要的是,收集了哪些统计数据,这些统计数据由以下参数控制 track_activities , track_activity_query_size , track_commit_timestamp , track_counts , track_functions  and track_io_timing  as mentioned in PostgreSQL Documentation.

Ramfs or tempfs?

有两种主要的基于RAM的文件系统:ramfs和tempfs。

ramfs可以使用/etc/fstab类似条目

ramfs /var/lib/pgsql_stats_ram ramfs size=1G,uid=postgres,gid=postgres 0 0

然而,有几个缺点。即使我们指定了uid and gid,,如上所示ramfs将被挂载为root:(。我们需要一个脚本或方法来改变PostgreSQL将运行的“postgres”账户的所有权或授予其权限。

ramfs的另一个问题是我们无法使用df命令。但是也有一个优点:ramfs可以动态调整大小,并且可以根据需要动态增长。这消除了估计所需大小的问题。但是,如果需要的话,ramfs不能使用swap,所以存在系统挂起的轻微风险,特别是在那些内存约束高的系统上。

考虑到风险和缺点,ramfs不太受欢迎,tempfs是最常用的

这是一个 tempfs 的 /etc/fstab 示例:

tmpfs /var/lib/pgsql_stats_tmp tmpfs size=1G,uid=postgres,gid=postgres 0 0

一旦挂载了这个文件系统,这与ramfs不同,它将显示为一个常规文件系统:

$ df -h| grep -E "(tmpfs|ramfs)"
Filesystem Size Used Avail Use% Mounted on...
tmpfs 1.0G 0 1.0G 0% /var/lib/pgsql_stats_tmp

现在的问题是指示PostgreSQL使用这个位置作为stats_temp_directory。请记住,这是一个动态参数,不需要PostgreSQL来反弹。

ALTER SYSTEM SET stats_temp_directory = '/var/lib/pgsql_stats_tmp';

我们只需要向PostgreSQL发送信号(SIGHUP)来重新加载新的配置。

select pg_reload_conf();

参考:

https://www.percona.com/blog/dont-forget-to-tune-stats-collector-for-postgresql-14-and-older/

https://www.postgresql.org/docs/14/monitoring-stats.html#MONITORING-STATS-SETUP

https://www.percona.com/blog/postgresql-15-stats-collector-gone-whats-new/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值