为大量ram调整postgresql


29

我有两个相同的服务器(就硬件而言),它们都是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多个演出的Ram?这些服务器是专门为此数据库材料构建的,因此,我认为数据库和支持过程未使用的所有内存都是浪费的。


4
您是否对初始调整进行了任何更改?步骤1 :(SET effective_cache_size=18G;默认设置非常低)BTW:假设这是一台64位计算机(无PTE)

1
您确实没有给我们足够的帮助。除了“它很慢”之外,我们对您的数据集不了解很多,您如何访问它,什么类型的查询通常运行缓慢,您已经完成了调优(甚至可能调错)服务器的工作。哎呀,在具有许多内核和内存通道的linux机器上,在安装postgresql之前很久就可以获得糟糕的性能。您受CPU或IO约束吗?您已经有哪些非默认设置?哪种查询速度慢?
Scott Marlowe'5

2
Postgres不会像您所说的那样“使用ram”。它的大部分缓存都依赖于OS文件系统页面缓存,因此,当您在运行postgres的系统上观看ram使用情况时,通常会看到OS缓冲区/缓存正在使用许多GB,而单个postgres后端进程仅使用少数几个每个数十MB。
dbenhur 2012年

1
看到这个链接: tekadempiere.blogspot.ae/2014/09/… 并从这里找到基于资源的c​​onf值:pgtune.leopard.in.ua
Sajeev

Answers:


41

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

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

max_connections不应将其设置为高于所需的值,即使空闲时连接也会占用资源;在大多数情况下,连接在内部等待的时间比在外部等待的时间更多。(以并发为代价)一个很好的经验法则公式是“心轴数+处理器数+ X”

work_mem棘手:可以将应用于每个子查询,因此5个查询的HASHJOINS成本为5 * work_mem。在最坏的情况下,您还应该考虑多个会话消耗此数量(再次保持max_connections较低水平的原因)。

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

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


优秀!我从来没有见过有效的缓存大小的重要性,它总是只与shared_buffers混为一谈。这确实产生了很大的变化。我也运行pgtune,它建议将20GB的96用于shard_buffers,但将64GB用作有效的cache_size。谢谢!

1
FWIW,我仔细阅读了Postgres文档中建议的这些设置和其他设置,并对服务器进行了分析
mlissner

非常感谢您的回答。我可以问一下,work_memmax_connections默认值为100并且服务器RAM为32GB(专用的postgres服务器)时,建议使用什么?我知道我需要根据每天的查询自行进行调整。我只是想知道您是否可以告诉我“一种尺寸能解决所有问题”的值(或起点值)。50MB太大了吗?非常感谢。
sgon00

这取决于计算机上典型的并发活动。可能需要100个会话,每个会话需要50M(在其10..20M之上)。或者,可能不会。要获得印象,请监视vmstat或top。加:这取决于您的查询(和其他)。看看计划。
6

@wildplasser非常感谢您的快速回复。我找到了一个有趣的网站 pgtune.leopard.in.ua。我认为我将以40MB为起点,并根据其建议进行调整。干杯。
sgon00

20

考虑使用pgtune帮助您调整PostgreSQL配置。从PgFoundry:

pgtune采用了默认的postgresql.conf并将数据库服务器扩展为与部署它的硬件一样强大

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

请记住,无需使用pgtune的确切建议。玩弄它的设置并查看对conf文件的最终更改,可以使您更好地了解PostgreSQL的配置以及如何手动对其进行调整。


8
pgtune的最新更新是在5年前的2009年,并且仍在不断增长。我想知道它是否仍然适用于9.1-9.2-9.3系列。
sorin 2014年

9
pgtune现在在线
Alfabravo 2015年

3

如果每个查询或命令运行缓慢,我怀疑:

  • 您为运行的每个查询连接到数据库;
  • 您已经配置了某种身份验证方法,该方法不起作用,它会暂停查询,直到该特定身份验证方法超时为止。

您能告诉我们运行一个查询需要多少时间select version()吗?如果应该是即时的(在我的工作站上为0.16ms)。


2

如果每个查询的速度都慢得多,则服务器或某些设备完全错误。以我的经验,每个数据库在某些方面都比其他数据库更好,但是性能明智的pgsql很容易与mssql服务器处于同一领域。

那么,您在什么操作系统上运行pgsql?什么硬件?您已经更改了哪些设置?您的数据集有多大?不良查询的示例是什么,explain analysis的输出是什么(像这样运行查询:

在这里解释分析选择...其余查询...;

将输出发布到http://explain.depesz.com/并在此处发布链接。


1
是的,每个查询/命令运行缓慢,是的,“某事”是完全错误的,因此是我的问题。问题在于,mssql正在充分利用服务器上的可用ram(如此繁重的缓存),而psql却没有。我感谢您的评论和建议,但是您一定错过了我的大部分问题和主题行本身。目前正在尝试其他人列出的一些建议...
user85116

1
使用您的内存不是问题。Postgresql依赖操作系统来执行大多数缓存。因此,不需要使用所有RAM。同样,您错过了我的大部分观点。您给我们的宝贵帮助很少。我以5000 TPS postgresql集群为生。您可以听取我的建议,或者继续认为自己知道pgsql的工作原理并进行争论。
Scott Marlowe

@ user85116,请听听Scott,我们已经有了MySQL的工作流,该工作流依赖于超级延迟,因此,当前MySQL正在使用64GB ram来快速执行该查询,而在具有实体化视图的2G Postgres上可以实现相同的功能。将所有数据库缓存到RAM不会解决您的问题,只会使其不那么可见。如果您在数据库结构中存在相同的问题,Postgres将不会为您修复它,也不会尝试将其隐藏。
kworr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.