我们在高峰时段无法处理到数据库服务器的流量。我们正在考虑改进硬件(有关此方面的信息,请参阅此问题),但我们还希望进行池配置和服务器调整。
我们正在开发的应用程序是一款适用于智能手机的基于回合的多人游戏,其后端由带有独角兽的Rails和PostgreSQL 9.1作为数据库。我们目前有60万注册用户,并且由于游戏状态存储在数据库中,因此每隔几秒钟就会进行数千次写入。我们已经使用PgBadger分析了PostgreSQL的日志文件,在关键时刻,我们得到了很多
FATAL: remaining connection slots are reserved for non-replication superuser connections
解决此问题的简单方法是增加postgresql.conf中的max_connections(当前为100) 。我已经阅读了http://wiki.postgresql.org/wiki/Number_Of_Database_Connections,这表明这可能不是正确的选择。在前面的文章中,它指的是在max_connections和pool size之间找到最佳位置。
为了找到这个最佳位置,可以做什么?有没有什么好的工具可以测量max_connections和池大小的不同值的I / O性能?
我们当前的设置是4个游戏服务器,每个服务器有16名独角兽工作者,池大小为5。
这是我们使用的非默认postgres设置:
version | PostgreSQL 9.1.5 on x86_64-unknown-linux-gnu,compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
checkpoint_completion_target | 0.9
checkpoint_segments | 60
checkpoint_timeout | 6min
client_encoding | UTF8
effective_cache_size | 2GB
lc_collate | en_US.UTF-8
lc_ctype | en_US.UTF-8
log_destination | csvlog
log_directory | pg_log
log_filename | postgresql-%Y-%m-%d_%H%M%S.log
log_line_prefix | %t
log_min_duration_statement | 200ms
log_rotation_age | 1d
log_rotation_size | 10MB
logging_collector | on
max_connections | 100
max_stack_depth | 2MB
server_encoding | UTF8
shared_buffers | 1GB
ssl | on
TimeZone | localtime
wal_buffers | 16MB
work_mem | 8MB
INSERT
的?您的架构是什么样的-是否已分区?什么explain analyze
是一些示例查询?您的检查站多久检查一次?(请参阅检查点日志记录选项)。认真地说,您的PostgreSQL版本是什么?(更新:似乎您在此处列出了硬件:dba.stackexchange.com/questions/28061/…)
synchronous_commit = off
synchronous_commit = off
还是commit_delay
?