为大量 ram 调整 postgresql

use*_*116 31 postgresql memory

我有两个相同的服务器(在硬件方面),它们都是 windows server 2008 r2 的标准安装,安装了最少的软件(基本上是我的代码和必需的东西,如 jvm 等)。

在一台服务器上,我在第二台服务器 postgresql 9.1 上运行 sql server 2005。这两个服务器的性能差异是惊人的,它在 postgresql 上太糟糕了,我很后悔我最初对我老板说“让我们使用 postgresql 而不是支付 sql server 许可证”的演讲。我们正在讨论同一命令的 30 秒与 15 分钟的差异,这不仅仅是这个命令,它是我向其抛出的任何查询或命令。它们都有几乎相同的数据(记录以不同的顺序插入),并且两个数据库具有完全相同的结构/索引等。

但我希望这只是性能调整的问题。问题是,sql server 几乎使用了服务器上所有 32 gig 的 ram,而 postgresl 什么也没使用,绝对比 gig 少,尽管我实际上还没有详细了解它。

如何让 postgresql 使用 20 多场内存?这些服务器是专门为该数据库内容构建的,因此在我看来,数据库和支持进程未使用的任何内存都被浪费了。

wil*_*ser 47

有许多可调整的常量,通过postgres.conf. 最重要的是:

  • max_connections: 并发会话数
  • work_mem :用于中间结果(如哈希表)和排序的最大内存量
  • shared_buffers 专用于“固定”缓冲区空间的内存量。
  • effective_cache_size 假定操作系统的 LRU 缓冲区使用的内存量。
  • random_page_cost :对磁盘寻道的相对成本的估计。

max_connections不应设置得高于需要,即使空闲时连接也会消耗资源;在大多数情况下,连接会花更多的时间在里面等待而不是在外面等待。(以并发为代价)一个很好的经验法则是“主轴数量+处理器数量+X”

work_mem很棘手: is 可以应用于每个子查询,因此具有 5 的查询HASHJOINS可能会花费 5* work_mem。对于最坏的情况,您还应该考虑使用这个数量的多个会话(这也是保持max_connections低的一个原因)。

shared_buffers(恕我直言)被高估了。通常建议将其设置为所有可用“空闲”内存的大约 1/4...1/2,但我倾向于将其保持在较低水平,并设置effective_cache_size为所有可用的“空闲”内存。

random_page_cost是磁盘上查找+读取的成本。它相对于sequential_disk_cost1。random_page_cost对于现代机器和网络存储,默认值 (4)设置得太高,通常可以降低到 2 和 1.x 之间。对于 SSD 磁盘,您甚至可以将其设置为 1.0,因为在 SSD 上查找几乎是免费的。


Pau*_*ora 20

考虑使用PGTune来帮助您调整 PostgreSQL 配置。

PostgreSQL 的默认配置非常保守,该工具旨在帮助解决这种情况。该文档易于阅读,使用该工具非常简单。

请记住,没有必要使用 PGTune 的确切建议。使用它的设置并观察对 conf 文件的结果更改将使您更好地了解 PostgreSQL 的配置以及如何手动调整它。

有关 PGTune 和名为 ClusterControl 的替代工具的更多信息:PGTune Alternatives - ClusterControl PostgreSQL 配置

  • pgtune 现在可用 [在线](http://pgtune.leopard.in.ua/) (9认同)
  • pgtune 的最后一次更新是在 2009 年,那是 5 年前,并且仍在计算中。我想知道它是否对 9.1-9.2-9.3 系列仍然有效。 (8认同)