問題点
複数のRailsアプリケーションから単一DBにアクセスする場合、以下の動作を行います。
- ActiveRecordはデータベース接続ごとにPreparedStatementを作成します。
- PostgreSQLはPreparedStatementをセッション毎にメモリに保持します。
その為、アプリケーションサーバの台数が増えたり、アプリケーションからのセッション数を増やしたりすると、DBのメモリを大幅に使用してしまいます。
対策
- 保持するPreparedStatementの数を制限する。(デフォルトは1000件)
database.yml
defaults: &default
adapter: postgresql
encoding: unicode
pool: 5
# キャッシュする上限を設定
statement_limit: 100
- PreparedStatementの使用を無効にする。
database.yml
defaults: &default
adapter: postgresql
encoding: unicode
pool: 5
# 無効にする場合
prepared_statements: false
参考
Rails Guide
PreparedStatementとは?
一言で言うと、DBが持っているクエリキャッシュ機能です。
https://www.postgresql.jp/document/pg820doc/html/sql-prepare.html