我在Windows Server 2003 64位上安装了PostgreSQL 9.0 64位。 该系统有8 x 3GHz的CPU和8GB的内存。
如何/应该configuration以下设置?
数据库用于anayltics。 在任何时候只有两三个用户连接运行查询。 数据集可以在1M和15M行之间,我想。
底层存储是连接光纤通道的EMC CX存储arrays。 这里的performance非常好。
您将在调整PostgreSQL服务器中find关于这三个问题的详细答案,以及有关您可能想要调整的其他一些参数的build议。 你不能在Windows上使用shared_buffers的大设置,在一个大约512MB的地方停止帮助。 打开log_temp_files,看看出现了什么,如果你真的需要提高work_mem。 根据你对数据集的看法,这听起来不像发出大量的个人查询,你可能甚至不需要担心。 适当提升maintenance_work_mem可能有助于后台自动清理工作,但除非对您造成问题,否则调整非常重要并不重要。
正确的值取决于使用模式。 不过这里有一些指导原则
shared_buffers:专用postgresql服务器的内存大小的25%。 work_mem:用于sorting等操作。 一个连接可以多次使用这个数量,所以如果你有很多的查询同时运行的话,要小心这个。 这一个需要大量的testing,看看它是否提高了性能,但不会使系统使用太多的内存。 所以,如果你增加这个,确保你的系统没有开始使用太多的内存。 我个人经常从4MB开始。
maintenance_work_mem:这是一个维护操作,如真空和索引设置它相当高的一般保存。 64M或128M通常很多。
还设置有效的caching大小。 这是规划器的一个提示,应该设置为由os +共享缓冲区大小用作磁盘caching的内存量。
如果你想进行广泛的调整,我build议阅读一本关于它的好书: PostgreSQL 9.0高性能 。
对于非常大的数据集,您可能会发现SAN不是最优的。 SANs在很多很多很小的ios上都非常出色。 在连续吞吐量情况下,它们往往是正常的,除非你有一个非常快速的互连,即使这样,它们往往只是没有优化顺序吞吐量。 我已经在我的机器上testing了具有电池备份caching的Areca和LSI RAID卡,使用Linux软件RAID的本地SAS接口以及后端的SAN上的顺序和随机读写性能。 最快的随机访问接近与SAN和RAID卡的关系,但是对于连续的吞吐量,Linux软件RAID将它们压制在地上。 如果硬件RAID可以达到350M / s,而SAN在100M / s范围内(它是连接在一起的),那么带有SW RAID的本地SAS可以获得大约1G / s的读取速度,而写入速度则可以达到80%左右。 当然所有的顺序。 不要以为你的SAN是超级快速的,可能是,它可能不是。 用bonnie ++或dd或者其他的东西来testing一下它的速度有多快。 如果连续达到100MB / s,那么在一台价格便宜的机器上,运行RAID-10的4个或8个7200RPM SATA驱动器进行分析的速度会很慢。
当你说8x 3GHz的CPU你是指8个插槽,每个都有4个或8个内核? 还是8核? 还是4核心超线程? 对于你的工作来说,过去4核心的任何事情可能都是浪费。 任何超过8核心的东西肯定是浪费。 有了OLAP / Analytics,如果能得到它们,你只需要更less的CPU。
在您的设置上。 shared_mem不需要很大。 在Windows上,共享内存实现对于大值是次优的,并且使其更大,很less有助于提高性能。 说,我会testing各种价值观,但几百megs可能会尽快得到。 维修工作人员可以在演出范围内,但是获得的收益大约在100M左右。 work_mem是postgresql脚踏枪。 如果你打算起来,我build议在你的机器上至less使用16或32M,确保你最多限制postgresql的max_connections参数为几十个连接。 如果不知何故,某人一次启动一堆查询,则可以快速耗尽内存。 不好。 OTOH,一些testing可能会显示,超过一百多个事情并不会真的有很大的帮助。
启动work_mem过高的危险在于,将操作系统caching的数据从caching中推出,只是需要重新加载。 点击磁盘获取数据的成本通常高于真正启动它的成本。
一个好的经验法则是保持work_mem * max_connections * 2 <1/4的内存。 所以,在64G ram和100个连接的机器上,你需要work_mem * 200 <16G或大约80 Megs max。 这确保了所有连接运行很多种类的任何病态行为都不会太简单地杀死机器。
如果您发现1G的work_mem比100M好得多,那么您可以通过将常规work_mem保持在较低的安全级别,并让运行大型查询的单个线程在连接上设置自己的work_mem来妥协。
我同意之前的海报,对于pgsql而言,windows并不是最理想的,强调的是,对于能够分配更多shared_memory的OLAP,情况会更糟糕,这对于pg / linux来说是个好处。
好。 你说“IO性能非常好”。 这并不意味着很多,但我认为这种硬件具有良好的顺序IO吞吐量…
您的查询看起来像“stream失大量数据以返回一些汇总结果”的风格,并行性较低。
对此的build议取决于数据的大小。
如果你的数据库(或者至less是经常访问的部分)足够小,可以很好地caching在RAM中,那么你的IO性能将不会太大影响(除了写入)。 但是如果你的数据库非常庞大,而且你想快速通过它,那么顺序IO性能就会很重要。
无论如何,首先是最简单的:
work_mem
当你用一些sorting和哈希(对于连接和聚合)或物化元组进行查询时,每个查询都可以使用work_mem。 sorting可以泄漏到磁盘,但不是散列。 请注意,如果您的查询具有N种sorting,则会使用N次work_mem。 有很多用户,这很重要。 在你的情况下,很less用户,你可以设置它很高,也许128MB。 即使对于比sorting快得多的大数据集,这种方式仍然可以被使用。 如果您需要,也可以在执行查询之前更改它。
maintenance_work_mem
同样的事情,索引创build等。 创build一个btree索引是一个很大的sorting,所以如果在一个巨大的表上创build一个索引,将maintenance_work_mem设置为1-2GB这样大的文件将需要更less的sorting通道(即临时文件)。 请记住,当您还原该备份时,不要同时启动10个索引创build…
更多细节 – >见文档
至于shared_buffers,在Windows上我不知道。 你应该问问邮件列表。
还记得pg只能使用每个查询一个核心,所以禁用超线程。 但是,并行扫描同一个表的多个查询将同步到只读取一次数据。
顺便说一下,有什么理由你没有在那个盒子上运行Linux? PG在Linux上更“原生”。