【PostgreSQL】PostgreSQL 15移除了Stats Collector
试用即将发行的PostgreSQL 15的人会发现少了一个后台进程:
postgres 1710 1 0 04:03 ? 00:00:00 /usr/pgsql-15/bin/postmaster -D /var/lib/pgsql/15/data/
postgres 1711 1710 0 04:03 ? 00:00:00 postgres: logger
postgres 1712 1710 0 04:03 ? 00:00:00 postgres: checkpointer
postgres 1713 1710 0 04:03 ? 00:00:00 postgres: background writer
postgres 1715 1710 0 04:03 ? 00:00:00 postgres: walwriter
postgres 1716 1710 0 04:03 ? 00:00:00 postgres: autovacuum launcher
postgres 1717 1710 0 04:03 ? 00:00:00 postgres: logical replication launcher
来和PostgreSQL 14比较一下:
postgres 1751 1 0 04:04 ? 00:00:00 /usr/pgsql-14/bin/postmaster -D /var/lib/pgsql/14/data/
postgres 1752 1751 0 04:04 ? 00:00:00 postgres: logger
postgres 1754 1751 0 04:04 ? 00:00:00 postgres: checkpointer
postgres 1755 1751 0 04:04 ? 00:00:00 postgres: background writer
postgres 1756 1751 0 04:04 ? 00:00:00 postgres: walwriter
postgres 1757 1751 0 04:04 ? 00:00:00 postgres: autovacuum launcher
postgres 1758 1751 0 04:04 ? 00:00:00 postgres: stats collector
postgres 1759 1751 0 04:04 ? 00:00:00 postgres: logical replication launcher
是的,stats collector进程没有了。但是去掉这个进程是个好事,一个主要的瓶颈和令人头疼的问题永远消失了。
stats collector的工作内容是什么?
新手用户可能想知道它是什么以及为什么PG 14和更早版本需要它。至少会有一些用户对用于查询计划的表级统计信息的收集(ANALYZE)感到困惑。但这是不同的。PostgreSQL跟踪每个进程的所有活动以获得累积统计信息,例如扫描表或索引的次数,或者最后一次vacuum或autovacuum在表上运行的时间,或者autovacuum在表上运行的次数等。所有stats collector收集的数据可通过不同的pg_stat_*视图获得。
问题点
由于会话的每个后端都是PostgreSQL中的一个单独进程,因此收集统计信息并传输并不是一件容易的事。每个后端将有关他们所做的活动的信息发送到单个"stats collector"进程。
这种通信过去是通过UDP套接字进行的。这种方法有很多问题,这不是一个可扩展的模型。
用户经常报告不同类型的问题,例如:过时的统计信息、stats collector未运行、autovacuum无法工作/启动等。
如果stats collector在特定机器上出现问题,过去真的很难理解出了什么问题。
"stats collector"的另一个不利影响是它引起的IO。如果启用DEBUG级别2,可能会看到不断出现在PostgreSQL日志中的消息,例如:
2022-08-22 03:49:57.153 UTC [736] DEBUG: received inquiry for database 0
2022-08-22 03:49:57.153 UTC [736] DEBUG: writing stats file "pg_stat_tmp/global.stat"
2022-08-22 03:49:57.153 UTC [736] DEBUG: writing stats file "pg_stat_tmp/db_0.stat"
2022-08-22 03:49:57.168 UTC [1278] DEBUG: autovacuum: processing database "postgres"
2022-08-22 03:49:57.168 UTC [736] DEBUG: received inquiry for database 13881
2022-08-22 03:49:57.168 UTC [736] DEBUG: writing stats file "pg_stat_tmp/global.stat"
2022-08-22 03:49:57.168 UTC [736] DEBUG: writing stats file "pg_stat_tmp/db_13881.stat"
2022-08-22 03:49:57.169 UTC [736] DEBUG: writing stats file "pg_stat_tmp/db_0.stat"
这可能会导致数据目录所在的挂载点产生大量IO。这是参数stats_temp_directory的值所指向的地方。在许多系统上,它将是数据目录中的pg_stat_tmp。
在Ubuntu/Debian上,它将位于/var/run/postgresql中,例如:
postgres=# show stats_temp_directory ;
stats_temp_directory
-----------------------------------------
/var/run/postgresql/14-main.pg_stat_tmp
(1 row)
PostgreSQL 15中的新特性
开始使用动态共享内存来收集统计信息,而不再使用文件和文件系统。
以前,统计收集器通过UDP接收统计更新,并通过定期将统计数据写入临时文件来共享统计数据。这些文件可以达到数十兆字节,并且每秒最多写入两次。这会阻止我们添加其他有用的统计数据。
现在统计信息存储在共享内存中。可变编号对象的统计信息存储在dshash哈希表中(由动态共享内存支持)。固定编号的统计信息存储在普通共享内存中。
pgstat.c的头文件包含该架构的概述。
不再需要统计信息收集器,将其删除。
现在副本删除了已删除对象的统计条目,从完全关闭的副本启动时不再需要重置统计信息。
显然,参数stats_temp_directory不见了。因此,我们不需要pg_stat_tmp目录,该目录是在数据目录(或其他位置)中,在该目录生成和读取所有统计文件。然而,仍保留此目录是因为不会破坏许多依赖于该目录的扩展,例如pg_stat_statements。
在加载扩展库之前,目录保持为空。例如,如果我们加载pg_stat_statements库,目录中会出现一个文件。
$ ls pg_stat_tmp/
pgss_query_texts.stat
当然,扩展不是免费的,他们也有对应的成本。
在新架构中,大多数统计更新首先在每个进程中本地累积为"pending"(每个backend都有一个backend本地哈希表)。"pending"是指它们已累积但尚未提交到共享统计系统(shared stats system)。之后会在提交或超时后刷新到共享内存。
由于统计数据会在有人尝试读取时同时被更新,因此读取一致性就出现了。因此PostgreSQL 15引入了一个新参数:stats_fetch_consistency,它可以取三个值none、cache 或snapshot:
·"none"是最有效的。但是,将不会提供读取一致性。但对于大多数使用来说应该没问题。
·"cache"确保重复访问产生相同的值,这对于涉及例如自连接(self-joins)是有必要的.
·"snapshot"在交互式检查统计信息时很有用,但开销更大。
默认为"cache"
如果是在共享内存中,重启后如何保持呢?
在被shutdown之前,检查点进程会将这些统计信息写入文件系统,重启后可以再次被加载。通常,如果是crash了,统计信息就丢失了。
这一改动是否会影响我的监控/脚本?
监控视图pg_stat_*会继续起作用。但是,要确保取得是stats_fetch_consistency的恰当的值。如上所述,pg_stat_tmp目录只是为扩展保留的。
其它
很多人像我一样,使用postgresql的等待事件来理解postgresql以及会话都把时间花费在哪的人。数据收集和分析工具,比如pg_gather,通过使用等待事件来分析问题。
为了更好地监控postgresql,三个新的等待事件被引入了:
·PgStatsDSA:等待统计动态共享内存分配器访问
·PgStatsHash:等待stats共享内存哈希表访问
·PgStatsData:等待共享内存统计数据访问
随着统计收集器的所有开销及其维护的消失,其他子系统(如 autovacuum)要做的工作就更少了。
此外,经常查询统计信息的监控工具预计会大大减少系统负载。
【PostgreSQL】PostgreSQL 15移除了Stats Collector的更多相关文章
- How to get the free disk space in PostgreSQL (PostgreSQL获取磁盘空间)
Get the current free disk space in PostgreSQL PostgreSQL获取磁盘空间 from eshizhan Here has a simple way t ...
- [PostgreSQL]PostgreSQL数据类型格式化函数——字符串和数值间的转换
详情见官网:http://www.postgres.cn/docs/10/functions-formatting.html PostgreSQL中有以下格式化函数: 函数 返回类型 描述 例子 to ...
- [postgreSql]postgreSql数据库、模式、表、函数的删除与创建
1.删除/新增数据库 DROP DATABASE "testDB"; CREATE DATABASE "testDB" WITH OWNER = t ...
- [PostgreSql]PostgreSql调用函数及用IF EXISTS判断表是否存在
1.创建一个函数function1 -- FUNCTION: public.function1(character varying, integer) -- DROP FUNCTION public. ...
- [PostgreSql]PostgreSql创建函数及函数的执行
1.准备好创建函数的脚本 -- FUNCTION: public.dynamic_placelist_select(integer, timestamp without time zone) -- D ...
- 华为云fusionsphere 6.1组件功能
[fsp@controller-21 ~]$ openstack --version ##fusionsphere 6.1基于openstack 2.2.1 [fsp@controller-21 ...
- Postgresql在线备份和恢复
1.实验环境 OS: RedHat Linux Enterprisedb 6.3 DB: postgresql 9.3 PGHOME: /opt/PostgreSQL/9.3 PGDATA: /opt ...
- linux下安装postgresql
环境:Linux localhost.localdomain 2.6.32-431 GNU/Linux x86_64 Postgresql版本:postgresql.9.5.3 添加开启自启设置:ht ...
- PostgreSQL installations
[root@test02 init.d]# ll /etc/init.d/postgresql-9.5 -rwxr-xr-x. 1 root root 10072 May 15 06:34 /etc/ ...
随机推荐
- .NET中获取Windows的常见路径
更新记录 本文迁移自Panda666原博客,原发布时间:2021年6月30日. 一.说明 每种平台都其预定义的规则,比如Windows平台有自己的规定.公司也有预定义的规章制度.那么在平台上开发和干活 ...
- Python爬虫-正则
介绍: 是 一门全新的语言,一种使用表达式的方式对字符串进行匹配的语法规则 我们抓取到的网页源代码本质上就是一个超长的字符串,想从里面提取内容,用正则再适合不过 优点:速度快.效率高.准确性高 缺点: ...
- 从Hadder看蛋白质分子中的加氢算法
技术背景 PDB(Protein Data Bank)是一种最常用于存储蛋白质结构的文件.而我们在研究蛋白质构象时,往往更多的是考虑其骨架,因此在很多pdb文件中直接去掉了氢原子.但是在我们构建蛋白质 ...
- 7 个有趣的 Python 实战项目,超级适合练手
关于Python,有一句名言:不要重复造轮子. 但是问题有三个: 1.你不知道已经有哪些轮子已经造好了,哪个适合你用.有名有姓的的著名轮子就400多个,更别说没名没姓自己在制造中的轮子. 2.确实没重 ...
- Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b1938128a963
报错信息:Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait ...
- 【计算机系统基础1】gdb、gcc简易使用指南
目录 1. 基本实验工具的使用 1.1GCC 在IA-32+LINUX平台 基本的GCC 命令 一些其他选项 1.2objdump 1.3gdb 启动gdb 调试工具 设置断点 启动程序运行 查看程序 ...
- 查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题
开发经常遇到分页查询的需求,但是当翻页过多的时候,就会产生深分页,导致查询效率急剧下降. 有没有什么办法,能解决深分页的问题呢? 本文总结了三种优化方案,查询效率直接提升10倍,一起学习一下. 1. ...
- 用Bootstrap4写了一个WordPress主题Writing
这是一个简洁的WordPress博客主题,为专注写作而设计. 本主题使用Bootstrap4框架开发. 主要功能 自适应: 标签云页面模板: 两栏设计: 全宽页面模板: 支持设置背景色和背景图片: 8 ...
- Qucs初步使用指南(不是multism)
众所周知,Multism是一款强大的电路仿真软件,学习电子电路的同学都会接触到. 但是,这软件不支持Linux.(这就很魂淡了啊) 我的主力机是Linux,不能进行电路仿真成了学习的最大障碍. 使用w ...
- 分享|2022数字安全产业大数据白皮书(附PDF)
内容摘要: 2021年以来,数字安全赛道的受关注程度达到一个历史新高度.<数据安全法><个人信息保护法><关键信息基础设施安全保护条例>,一个接一个重磅的法规接连出 ...