我们正在调查我们的一个虚拟机中的 I/O 负载以及优化它的可能性,结果表明大部分负载是由 PostgreSQL 的统计信息收集器生成的。它在 3,5 和 6,5 MB/s 之间跳跃。我已经找到了一些关于这个主题的有趣资源,他们建议使用 tmpfs 将大部分统计信息保存在内存中,这对我来说很有意义,并且具体的 VM 有足够的可用 RAM 来支持这种情况。
来源 1 说明如下:
重新启动后,PostgreSQL 会将文件复制到新位置(并在停止时返回)。
这与temp
配置名称中的stats_temp_directory
声音相结合,就像数据被保存在其他地方一样。
那么在 Postgres 进程不正常关闭的情况下临时数据会发生什么情况呢?如果该过程在上周运行而没有任何问题,它是否完全丢失了?还是 Postgres 在运行时定期将数据保存在临时目录之外?它可以在不干净的关机后简单地使用可用的临时数据吗?
我之所以问,是因为目前一旦写入的数据会持久保存在本地文件系统中,并且写入数据的操作似乎是原子的,但是如果我们改用 tmpfs,如果整个服务器出现故障,可能会丢失几周的统计数据一些原因。
有没有办法让 Postgres 定期保存 tmpfs 之外的数据,比如每隔几个小时左右一次?
或者我是否需要使用一些覆盖/堆叠/任何文件系统,将持久的文件系统安装为较低的,将 tmpfs 安装为较高的,并找到某种方法来手动同步一次?
谢谢!
PostgreSQL 没有内置工具来定期保存收集器统计信息。它们被认为是可更换的。请记住,分析器收集的表统计信息与统计信息收集器收集的统计信息之间存在差异。后者是 stats_temp_directory 中的内容。
因此,您在这里的答案将取决于您为什么要在发生崩溃时保留它们。有两个原因:
我认为第一个原因可能无关紧要,除非您有某些原因导致 PostgreSQL 每天都意外关闭,在这种情况下您应该解决这个问题。此外,您可以通过在重新启动 Postgres 后运行数据库范围的 VACUUM 来修复问题。
由于第二个原因,仅仅累积计数器本身并没有那么有用。我的意思是,如果一个表在其生命周期中有 100,000 次删除,这是否意味着它在 100 天内每天有 1000 次删除,或者是否意味着昨天有人刚刚删除了一半的表?你不知道。因此,如果您关心这些计数,您应该每天或每小时对您的统计数据进行快照,以便您获得时间和计数。您可能会看一下重振 pgStatsPack 的尝试,该工具正是这样做的。