我有一个单节点的 proxmox 集群,我想用 PostgreSQL 和 TimescaleDB 启动一个新的 VM,经过大量阅读有关如何为此目的调整 ZFS 卷的内容后,我仍然对缓存选项有一些疑问。我们有 3 个缓存:proxmox 一个(ARC)、linux vm 一个(LRU)和 PostgreSQL 一个(时钟扫描);从更远到更靠近 DB 的顺序。
我已经阅读了很多信息,其中一些是矛盾的,所以我不知道这是否属实,但似乎 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 操作系统和其他数据库进程。
- 创建一个具有大量 RAM(比如说 48 GB)的 VM,并将 shared_buffers 保持在相同的 10 GB 中。zfs 还将主缓存设置为元数据。这样,缓存将更靠近数据库和虚拟机内部,但逻辑最差。似乎 LRU 对 DB 有点不利。
- 创建一个具有大量 ram 和 primarycache=all 的 VM。我认为这将是一件坏事,因为:1)VM 和 proxmox chaches 将争夺资源。2)缓存复制。
为了给出一些上下文,该节点有 64GB 的总 RAM,PG/timescaleDB 将是在其上运行的要求更高/优先级更高的应用程序。
那么,我最初的假设是否正确?哪种配置会更好?你会改变什么?
最好的问候,感谢您的时间,
赫克托
我的建议是使用解决方案#4:创建一个具有大量 RAM 并在 KVM (Proxmox) 端
cache=none
用于数据磁盘的 VM。这将完全阻止 Proxmox 使用主机页面缓存,从而有效地运行真正的存储同步。通过这种方式,您可以在 VM 中尽可能接近裸机,并可以在那里微调您的缓存。请注意,对于我所知道的所有数据库(包括 PostgreSQL),RAM 缓冲区不仅是磁盘缓存,而且会将至少部分数据保留为磁盘格式中的可读取格式。这意味着,为 DB 进程预留的 RAM 比仅用作 I/O 缓冲区的 RAM 更有价值。
如果您的数据库可以回答来自(它自己的)RAM 的查询,它根本不会通过 IO 堆栈运行,从而大大节省了延迟。