2017-10-02 9 views
2

私は、データストアとしてPostgresを使用するRuby on railアプリケーション(Mastodon)をホストしています。Postgresqlに関する多くのリクエストを処理するには

私は多くのリクエストを受け取りました。これは、アプリケーションが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 

DBサーバは、2GのRAMを搭載した専用のVPS上です。

私はレール側に乗ったエラーの種類:

a connection from the pool within 5.000 seconds (waited 5.000 seconds); all pooled connections were in use 

そして、時には要求タイムアウトに関するエラー(リクエストが90000msよりも長く走りました)。この設定で

マイレールのアプリスポーン労働者:

- WEB_CONCURRENCY=4 
    - MAX_THREADS=10 
    - DB_POOL=20 

任意のアイデアはどのようにこの忙しいPostgresのプールの問題を停止するには? 設定上の問題かもしれません。

他の方法であれば、Postgresスレーブの読み込みがあるでしょうか?私はビットがリクエスト番号を超過してい

..

答えて

0

I.まず、私はpgtune.leopard.in.uaを使用するなど、あなたのRAM、OS、Postgresのバージョン、接続数を、合わせてのPostgresをタイン。あなたのVPSと他のオプションのパラメータを入力して、それに応じてpostgresql.confを変更してください。

II。 次に、database.ymlを見てください。多くの場合、本番環境では最大5つの接続(デフォルト)が可能です。あなたのニーズに合わせて、この数を増やすようにしてください:

#config/database.yml 
production: 
    ... 
    pool: 20 

それはプールにI.

IIIからの接続の最大数を置くことは理にかなっています。データベースクエリを最適化します。クエリn+1を修正するには、ActiveRecord.preload,includesを使用します。 Gem bulletは、データベースへのクエリ数の問題を特定するのに役立ちます

関連する問題