PostgreSQL 计划优化性能并降低内存管理开销原创
Postgres 的 David Rowley 提交了一项重要的修改,旨在提升 PostgreSQL 性能并减少内存管理开销。此举将 chunk header 的大小从 16 字节减少到了 8 字节:
此处所做的更改将我们所有 3 种内存上下文类型的 chunk header 大小减少到仅 8 个字节。对于中小型分配,这显着增加了我们可以在给定 chunk 上放置的 chunk 数,从而更有效地使用内存。
此外,此 commit 彻底改变了指向 palloc 内存的指针必须直接以指向拥有内存上下文的指针作为前缀的规则;相反,我们现在坚持它们直接以 8 字节值作为前缀,其中最不重要的 3 位被设置为一个值,以指示指针属于哪种类型的内存上下文。使用这 3 位作为索引(称为 MemoryContextMethodID)到存储每种内存上下文类型的方法的新数组,我们现在可以将给定函数的指针(例如 pfree () 和 repalloc () )传递给特定于该上下文实现的函数,以允许他们设计自己的方法来查找拥有给定分配的内存块的内存上下文。
更多细节可以查看此 commit。
Phoronix 指出,在早些时候围绕减少 PostgreSQL 内存开销的讨论中,Rowley 就曾在 Ryzen Threadripper workstation 上的只读简单工作负载中实现了 17% 的吞吐量性能提升。
“当这种内存开销的减少在稳定的 PostgreSQL 版本中首次出现时,看看它在现实世界中的帮助肯定是有趣的。但是,由于 PostgreSQL 15 已经在今年晚些时候发布之前进行了分支,预计这种变化要到 PostgreSQL 16 才会出现。”