我想知道如何优化部署在 Kubernetes 中的 PostgreSQL 数据库的 RAM 使用率。
特别是我对配置shared_buffers
和effective_cache_size
值感兴趣。
通常,各种来源提出的建议是使用:
如果您的系统具有 1GB 或更多 RAM,shared_buffers 的合理起始值是系统内存的 1/4。如果您的 RAM 较少,则必须更仔细地考虑操作系统占用了多少 RAM;那里更典型的是接近 15%。在某些工作负载中,更大的 shared_buffers 设置也很有效,但考虑到 PostgreSQL 也依赖于操作系统缓存的方式,您不太可能会发现使用超过 40% 的 RAM 比使用更小的 RAM 更好。(PostgreSQL 网站)
该值应设置为机器总 RAM 的 15% 到 25%(EDB 网站)
不超过 50% 的可用 RAM(EDB PostgreSQL 调优)
由于容器通过设计使用更少的背景 RAM,因此设置 shared_buffers 值的好建议是什么?
现在该值设置为 25%(1GB 的 4GB 总容器限制),我注意到它很快就被填满了。
shared_buffers 与有效缓存大小
在 postgresql 调优中,这两个数字代表:
因此,如果有很多 shared_buffers,缓存的重复查询将“更好”工作。但是如果有更多的 Effective_cache_size,从数据库底层的磁盘读取表会“更好”
如果工作负载如此多变且不重复,以至于需要重复磁盘读取,则 Effective_cache_size 越高越好。如果一个小集合中有很多相同的查询,那么更多的 shared_buffers 会更好
值得记住的是,在正常工作的 Linux 系统上,系统将抓取任何“空闲”内存用于磁盘缓存,因为可能会发生意外读取,如果他们这样做,否则未使用的内存可能会加速它们
如何确定最佳设置
值得一提的是,最常用的“方法”是不关心和过度配置所使用的内存。硬件很便宜,而正确解决它的时间很昂贵。那说..
有两种方法
要监控 prod 中的内存,通常使用第三方软件包(如 cAdvisor 或 Prometheus)来完成
查看图表并将它们与您的传入请求进行比较。如果明显有很大的余量,则增加参数,看看这是否有助于系统效率。
对于测试,基本上你做同样的事情,但使用人工测试工作负载
为了计算出最好的内存大小,有像 senpai这样的自动化工具。基本上,他们将在各种内存设置下重复运行测试工作负载,直到它停止