我有一个单节点的 proxmox 集群,我想启动一个带有 PostgreSQL 和 TimescaleDB 的新 VM,在阅读了大量有关如何为此目的调整 ZFS 卷的资料后,我仍然对缓存选项存有疑虑。我们有 3 个缓存:proxmox 缓存 (ARC)、linux vm 缓存 (LRU) 和 PostgreSQL 缓存 (时钟扫描);按从远到近的顺序排列。
我读了很多信息,其中一些是相互矛盾的,所以我不知道这是否属实,但似乎 PG 缓存的设计方式与内核缓存不同,内核缓存会尝试捕获所有内容,并且仅在没有足够空间继续缓存时才将其逐出。事实上,它似乎更像是当前正在处理的数据的缓冲区,而不是长期缓存。事实上,它被称为共享缓冲区。我猜这就是为什么文档不建议将 shared_buffers 设置为可用内存的高百分比(如 ARC 所做的那样),而是在 25% 到 50% 之间。似乎真正的 PG 缓存是内核缓存,而不是 shared_buffers。
考虑到这一点,有一些可能的配置需要考虑:
- 创建一个具有适量 RAM(假设为 12GB)的 VM,并将 shared_buffers 设置为 10GB。尝试:1) 拥有足够的内存作为正在进行的查询的缓冲区。2) 限制 VM RAM 以不使用其缓存,其 LRU 配置应该是最差的,而是使用具有更好权重的 ARC 配置。此配置的问题可能来自缓存在 VM 之外,可能会降低性能而不是提高性能。另外,我不确定在 shared_buffers 大小之外还剩下多少空间来运行 VM OS 和其他 DB 进程。
- 创建一个具有大量 RAM(假设为 48 GB)的 VM,并将 shared_buffers 保持在相同的 10GB 中。此外,zfs 将主缓存设置为元数据。这样,缓存将更靠近 DB 并位于 VM 内部,但逻辑最差。似乎 LRU 对 DB 有点不利。
- 创建一个具有大量 RAM 且 primarycache=all 的 VM。我认为这是一件坏事,因为:1) VM 和 proxmox 缓存将争夺资源。2) 缓存重复。
为了提供一些背景信息,该节点总共有 64GB 的 RAM,并且 PG/timescaleDB 将是其上运行的要求更高/优先级更高的应用程序。
那么,我最初的假设正确吗?哪种配置效果更好?你会改变什么?
谨致问候,感谢您的时间,
赫克托
答案1
我的建议是使用解决方案 #4:创建一个具有大量 RAM 的 VM,并在 KVM(Proxmox)端将其用作cache=none
数据磁盘。这将完全阻止 Proxmox 使用主机页面缓存,从而有效地运行实际存储同步。这样,您就可以在 VM 中尽可能接近裸机,并可以在那里微调缓存。
请注意,对于我所知道的所有数据库(包括 PostgreSQL),RAM 缓冲区不仅仅是磁盘缓存,还会将至少部分数据保留为可读格式,而不是磁盘格式。这意味着,为 DB 进程预留的 RAM 比仅用作 I/O 缓冲区的 RAM 更有价值。
如果您的数据库可以从(它自己的)RAM 回答查询,它就根本不会通过 IO 堆栈运行,从而大大节省了延迟。