【问题标题】:Postgresql RAM optimization for containers and kubernetes容器和 kubernetes 的 Postgresql RAM 优化
【发布时间】:2022-01-03 22:32:18
【问题描述】:

我想知道如何优化部署在 Kubernetes 中的 PostgreSQL 数据库的 RAM 使用率。

我对配置 shared_bufferseffective_cache_size 值特别感兴趣。

通常,各种来源提出的建议是使用:

  • 如果您的系统具有 1GB 或更多 RAM,shared_buffers 的合理起始值是系统内存的 1/4。如果您的 RAM 较少,则必须更仔细地考虑操作系统占用了多少 RAM;那里更典型的是接近 15%。在某些工作负载中,更大的 shared_buffers 设置也很有效,但考虑到 PostgreSQL 也依赖于操作系统缓存的方式,您不太可能会发现使用超过 40% 的 RAM 比使用更小的 RAM 更好。 (PostgreSQL Website)

  • 该值应设置为机器总 RAM 的 15% 到 25% (EDB website)

  • 不超过可用 RAM 的 50% (EDB PostgreSQL tuning)

由于容器在设计上使用的后台 RAM 要少得多,因此设置 shared_buffers 值有什么好的建议?

现在该值设置为 25%(4GB 总容器限制中的 1GB),我注意到它很快就被填满了。

【问题讨论】:

  • 无法回答,因为我们不知道您将如何使用数据库。没有一种万能的解决方案。你已经找到了 25% 的建议开始。其余的,你必须测试和优化你自己的环境。
  • 感谢您的回答。您能给我推荐一些关于 Postgres 优化的好的学习资源吗?

标签: postgresql docker containers


【解决方案1】:

shared_buffers 与有效缓存大小

在 postgresql 调优中,这两个数字代表:

  • shared_buffers “有多少内存专用于 PostgreSQL 用于缓存数据”
  • effective_cache_size "操作系统和数据库本身有多少内存可用于磁盘缓存"

因此,如果有很多 shared_buffers,缓存的重复查询会“更好”工作。但是如果有更多的 Effective_cache_size,从数据库底层的磁盘读取表会“更好”

如果工作负载如此多变且不重复,以至于需要重复磁盘读取,那么 Effective_cache_size 越高越好。如果一个小集合中有很多相同的查询,那么更多的 shared_buffers 会更好

值得记住的是,在正常工作的 Linux 系统上,系统会抓取任何“空闲”内存用于磁盘缓存,因为可能会发生意外读取,如果他们这样做,否则未使用的内存可能会加速它们

如何确定最佳设置

值得一提的是,最常用的“方法”是不关心并过度配置使用的内存。硬件很便宜,而正确解决它的时间很昂贵。就是这么说的。。

有两种方法

  1. 在 prod 中运行应用程序并监控内存压力
  2. 设计一个测试来找出内存使用的限制

为了监控 prod 中的内存,通常使用 cAdvisor 或 Prometheus 等第三方软件包来完成

查看图表并将其与传入的请求进行比较。如果明显有很大的余量,则增加参数,看看这是否有助于系统效率。

对于测试,基本上你做同样的事情,但使用人工测试工作负载

要计算出最好的内存大小,可以使用自动化工具,例如 senpai。基本上他们会在各种内存设置下反复运行测试工作负载,直到它停止

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多