結論
database.yml
に prepared_statements: false
または statement_limit: 100
(デフォルトが1000) を設定する。もちろん値は100でなくてもいい。
database.yml
production:
adapter: postgresql
prepared_statements: false
または
database.yml
production:
adapter: postgresql
statement_limit: 100
この値が大きいと、Rails側ではなく、データベース側に PreparedStatement
のキャッシュがメモリに保存されるためデータベースのメモリをぐんぐん消費するのだ。
アプリの内容と相談し、 PreparedStatement
キャッシュが少なくてよいなら減らすべき。
というかデフォルト 1000
は多すぎるような気がする。
このキャッシュは接続毎に効いてくるので App Server を複数台で冗長化してる場合などは劇的に効いてくる。というか、逆に言うとデフォルト設定だとApp Serverを増やすとあっという間にデータベースのメモリを消費してしまうことになる。
railsguide にシレっと載っている情報だが、案外ネットで見つかりにくい情報なので載せることにした。