Posted at

Rails / PostgreSQL の組み合わせで使ってる場合に、PostgreSQL のメモリ消費を劇的に減らす方法

More than 3 years have passed since last update.


結論

答えは、 http://railsguides.jp/configuring.html#postgresql%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B に書いてある。

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