我一直在考虑迁移到 RAMdisk 的想法。我知道它的风险,但只是想做一个小基准。我只有两个问题:(a)在读取查询计划时,它是否仍能区分磁盘命中和缓冲区命中?如果是这样,我应该假设两者都同样昂贵,还是应该假设它们之间存在差异?(b) RAM 磁盘不是持久的,但如果我想将一些结果导出到持久存储,我需要采取一些预防措施吗?它和平常一样吗,例如 COPY 命令?
2 回答
我不建议在 PostgreSQL 中使用 RAM 磁盘进行持久存储。通过仔细调整,您可以让 PostgreSQL 使用的磁盘 I/O 不会超过使数据持久化所需的磁盘 I/O。
我建议这样做:
机器中的 RAM 大于数据库的大小。
定义
shared_buffers
足够大以包含数据库(在 Linux 上,定义内存大页面以包含它们)。增加
checkpoint_timeout
并max_wal_size
获得更少的检查点。设置
synchronous_commit = off
为防止 PostgreSQL 在每次提交时将 WAL 同步到磁盘。如果您乐于在崩溃的情况下丢失所有数据,请定义您的表
UNLOGGED
。数据将在正常关机后继续存在。
无论如何,回答你的问题:
(a) 你应该设置一个更低seq_page_cost
的random_page_cost
值来告诉 PostgreSQL 你的存储有多快。
(b) 您可以使用pg_dump
或运行备份pg_basebackup
,他们不在乎您拥有什么样的存储空间。
在读取查询计划时,它还会区分磁盘和缓冲区命中吗?
它从一开始就没有区分它们。它区分“命中”和“读取”,但“读取”无法分辨哪些真正来自磁盘,哪些来自 OS/FS 缓存。
PostgreSQL 不知道您在 RAM 磁盘上运行,因此将继续像往常一样报告这些。
如果是这样,我应该假设两者都同样昂贵,还是应该假设它们之间存在差异?
这是一个应该通过您的基准测试来回答的问题。在某些系统上,内存可以从主内存预读到更快的缓存中,使得顺序读取仍然比随机读取更快。如果您关心,您将不得不在自己的系统上对其进行基准测试。
由于锁管理等原因,将数据从 RAM 读取到 shared_buffers 仍然非常昂贵。所以作为一个粗略的起点,也许seq_page_cost=0.1
和random_page_cost=0.15
。
RAM 磁盘不是持久的,但如果我想将一些结果导出到持久存储,我需要采取一些预防措施吗?
风险是您的系统在导出完成之前崩溃。但是你能采取什么预防措施呢?