Postgres 性能改进和清单
Posted
技术标签:
【中文标题】Postgres 性能改进和清单【英文标题】:Postgres performance improvement and checklist 【发布时间】:2014-02-15 10:22:12 【问题描述】:我正在研究我用Java 编写的应用程序 的性能 相关的一系列问题,其中有大约 每天 100,000 次点击,并且每次访问平均在 2 个主要数据库表(均分)上读取/写入 5 到 10 次,其基数介于 1 到 300 万条记录之间(我通过休眠访问数据库)。
我的两个主表存储用户信息(大约 60 列类型为 varchar、integer 和 timestamptz)和另一个链接到要显示的数据(这里大约 30 列主要是 varchar、integer、timestamptz)。
我遇到的主要问题可能是我的网站性能下降(让我们谈谈超过 5 秒的时间加载,显然 确实如此不仅取决于数据库性能),是FillFactor的使用,它目前是默认值100(它总是在以下情况下使用数据不变..)。
显然填充因子在索引上是相同的(每 2 个 btree 类型的表有 10 个)
目前在我制作的主桌子上
40% 选择操作 30% 更新操作 20% 操作插入 10% 的删除操作。我的数据库还由 40 个其他次要的表组成(只有其他 3 个具有相同的用户基数)。
我的问题是:
您如何找到要设置的填充因子的正确值? 可以是要检查以改进性能的清单 这种数据库?数据库位于服务器专用(16GB Ram,8 核)上,存储在 SSD 磁盘上(数据全天备份并移动到另一个存储上)
【问题讨论】:
你可以浏览这个 wiki 页面:wiki.postgresql.org/wiki/Performance_Optimization 我也强烈推荐“Postgres 高性能手册”。真的值得购买。 【参考方案1】:您可能已经达到了内存使用的“拐点”,其中频繁使用的表的整个索引不再适合共享内存,因此磁盘 I/O 会减慢它的速度。通过检查磁盘 I/O 是否高于正常值来确认。如果是这样,请尝试增加共享内存(shared_buffers),或者如果已经达到最大值,请调整系统共享内存大小或添加更多系统内存,以便将其提高。您可能还必须开始调整临时缓冲区、工作内存和维护内存以及 WAL 参数(如 checkpoint_segments 等)。
PostgreSQL.org 上有一些性能调整提示,Google 是你的朋友。
编辑:(解决第一条评论)内存不足的第一个症状是性能大幅下降,其他一切都相同。如果您在内存使用方面遇到问题,那么更改表格填充因子不会有任何影响,如果有的话,它会使情况变得更糟 w.r.t.加载时间(我假设这意味着“数据库读取”),因为行信息将扩展到磁盘上的更多页面,每个页面都有空白空间,因此表扫描需要更多的磁盘 I/O。但是填充因子小于 100% 可以帮助 UPDATE 操作,但我发现调整 WAL 参数可以在使用索引时补偿大部分时间(除非您已经优化了这些)。最重要的是,您需要使用 EXPLAIN 分析所有繁重的查询,看看有什么帮助。但乍一看,我很确定这是一个内存问题,即使是 SSD 上的数据库也是如此。我们谈论的是大量随机读取和随机写入,并且在大量随机小写入之后,许多 SSD 实际上变得比 HDD 更更糟。
【讨论】:
对这些表进行聚类/分区可能是一种解决方案(FillFactor 为 100)?以上是关于Postgres 性能改进和清单的主要内容,如果未能解决你的问题,请参考以下文章