結論
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 にシレっと載っている情報だが、案外ネットで見つかりにくい情報なので載せることにした。