0

我一直在考虑迁移到 RAMdisk 的想法。我知道它的风险,但只是想做一个小基准。我只有两个问题:(a)在读取查询计划时,它是否仍能区分磁盘命中和缓冲区命中?如果是这样,我应该假设两者都同样昂贵,还是应该假设它们之间存在差异?(b) RAM 磁盘不是持久的,但如果我想将一些结果导出到持久存储,我需要采取一些预防措施吗?它和平常一样吗,例如 COPY 命令?

4

2 回答 2

2

我不建议在 PostgreSQL 中使用 RAM 磁盘进行持久存储。通过仔细调整,您可以让 PostgreSQL 使用的磁盘 I/O 不会超过使数据持久化所需的磁​​盘 I/O。

我建议这样做:

  • 机器中的 RAM 大于数据库的大小。

  • 定义shared_buffers足够大以包含数据库(在 Linux 上,定义内存大页面以包含它们)。

  • 增加checkpoint_timeoutmax_wal_size获得更少的检查点。

  • 设置synchronous_commit = off为防止 PostgreSQL 在每次提交时将 WAL 同步到磁盘。

  • 如果您乐于在崩溃的情况下丢失所有数据,请定义您的表UNLOGGED。数据将在正常关机后继续存在。

无论如何,回答你的问题:

(a) 你应该设置一个更低seq_page_costrandom_page_cost值来告诉 PostgreSQL 你的存储有多快。

(b) 您可以使用pg_dump或运行备份pg_basebackup,他们不在乎您拥有什么样的存储空间。

于 2020-03-23T14:14:18.547 回答
1

在读取查询计划时,它还会区分磁盘和缓冲区命中吗?

它从一开始就没有区分它们。它区分“命中”和“读取”,但“读取”无法分辨哪些真正来自磁盘,哪些来自 OS/FS 缓存。

PostgreSQL 不知道您在 RAM 磁盘上运行,因此将继续像往常一样报告这些。

如果是这样,我应该假设两者都同样昂贵,还是应该假设它们之间存在差异?

这是一个应该通过您的基准测试来回答的问题。在某些系统上,内存可以从主内存预读到更快的缓存中,使得顺序读取仍然比随机读取更快。如果您关心,您将不得不在自己的系统上对其进行基准测试。

由于锁管理等原因,将数据从 RAM 读取到 shared_buffers 仍然非常昂贵。所以作为一个粗略的起点,也许seq_page_cost=0.1random_page_cost=0.15

RAM 磁盘不是持久的,但如果我想将一些结果导出到持久存储,我需要采取一些预防措施吗?

风险是您的系统在导出完成之前崩溃。但是你能采取什么预防措施呢?

于 2020-03-23T15:07:38.380 回答