如何在Postgresql上处理很多请求

时间:2017-10-02 07:56:16

标签: ruby-on-rails ruby postgresql

我托管使用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奴隶进行读取吗?

我的请求号码有点超出..

1 个答案:

答案 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.preloadincludes。 Gem bullet可以帮助您识别数据库查询数量的问题