2010-01-19 66 views
2

我们目前有一个Postgres数据库,其中有100个表,其中20个表的行数超过5 000 000行,主数据库服务器在Debian 32MB RAM 8处理器上运行。Postgres调整和缩放

另外还有一个使用Slony复制的Slave DB。

我们的应用程序使用Java和Hibernate框架进行SQL查询,c3p0作为连接池。

我们的问题是,我们预计目前在高峰时段大约30和大约4在低交通时间的高负荷。 目前我们没有在主从机之间使用select语句进行负载平衡。

Postgres的主DB的配置如下:

shared_buffers = 6144MB 
temp_buffers = 16MB 
max_prepared_transactions = 20 
work_mem = 128MB 
max_fsm_pages = 409800 

自动清理是上。

C3P0 Hibernate的连接池的配置是:

<property name="c3p0.min_size">3</property> 
<property name="c3p0.max_size">200</property> 
<property name="c3p0.timeout">300</property> 
<property name="c3p0.max_statements">1000</property> 
<property name="c3p0.idle_test_period">300</property> 

一个我们面临的主要问题是选择查询是非常复杂的,大量加入,甚至工会。

什么是解决方案来调整我们的实际系统,避免高负载?

升级硬件? 主控与从属之间的负载平衡? 错误的配置?

任何建议在更好的负载平衡复制系统比slony?

优化SQL语句是不可能的,因为我们没有开发软件。

回答

1

除非你使用2PC,你max_prepared_transactions应该是0

work_mem过高200个连接。你可能会想把它降到32Mb左右。这可能会导致您交换,这会对您的表现造成灾难性后果。

也就是说,将连接池限制为< < 200个连接以获得最佳性能。可能大约50左右会给你最好的表现。

至于FSM,完全取决于你的访问模式。如果你升级到8.4,你会有一个自动调整,所以这可能是一个升级的理由(当然还有更多)。

很难说比这更多地了解系统。你可能想要去找一个PostgreSQL咨询公司来给你一个完整的性能评估。

一般来说,使用这么小的数据库,如果你设置得当,应该可以得到相当不错的性能。

2

有一个PostgreSQL参数调整的基本介绍,称为Tuning Your PostgreSQL Server您应该阅读。你没有碰到影响性能的两个最重要的事情:effective_cache_size,一个糟糕的设置会搞砸查询计划,以及checkpoint_segments,你必须提高它才能从数据库中获得体面的写入速度。如果你有复杂的查询,查看default_statistics_target也是一样。您可能还想要Log difficult queries,然后Use Explain找出他们为什么慢慢运行。

+0

使用解释的结果,您可能能够定义新的索引,这将改进sql语句的性能而不会改变它们。 – crowne 2010-01-20 07:21:41