我托管使用Postgres作为数据存储区的Ruby on rail应用程序(Mastodon)。
我收到了很多请求,它引发了有关池的问题,导致应用程序需要等待在Postgres发言。
我在这个配置中使用Pgbouncer:
max_client_conn = 2000
default_pool_size = 50
我已经调整了Postgres:
max_connections = 500
shared_buffers = 512MB
effective_cache_size = 1536MB
work_mem = 1048kB
maintenance_work_mem = 128MB
min_wal_size = 1GB
max_wal_size = 2GB
checkpoint_completion_target = 0.7
wal_buffers = 16MB
default_statistics_target = 100
数据库服务器位于具有2G内存的专用VPS上。
我在铁路方面遇到的那种错误:
a connection from the pool within 5.000 seconds (waited 5.000 seconds); all pooled connections were in use
有时请求超时错误(请求运行时间超过90000毫秒)。
我的铁路应用程序使用此配置生成工作人员:
- WEB_CONCURRENCY=4
- MAX_THREADS=10
- DB_POOL=20
任何想法如何阻止这个忙碌的Postgres池问题? 也许这是一个配置问题。
任何其他处理方法都会让Postgres奴隶进行读取吗?
我的请求号码有点超出..
答案 0 :(得分:0)
我。首先,你的Postgres适合你的RAM,操作系统,Postgres版本,连接数等等。我使用pgtune.leopard.in.ua。只需输入VPS和其他选项的参数,然后相应地修改postgresql.conf
<强> II。强> 然后看看你的database.yml。通常它允许在生产中最多5个连接(默认情况下)。尝试增加这个数字以满足您的需求:
#config/database.yml
production:
...
pool: 20
将I中最大连接数放入池中是有意义的。
III。优化您的数据库查询。修复n+1
次查询,使用ActiveRecord.preload,includes。 Gem bullet可以帮助您识别数据库查询数量的问题