Render.comでRailsアプリのメモリ使用量を1/4に削減してstarterプランで運用する方法
はじめに
Render.comでRailsアプリケーションをデプロイしようとした際、starterプラン(512MB)ではメモリ不足でアプリが正常に動作せず、月額$25のプランにアップグレードすることになりました。
しかし、適切な最適化を行うことで、メモリ使用量を大幅に削減し、starterプランでも快適に動作させることができるようになりました。この記事では、その具体的な方法とコスト削減効果について解説します。
問題:starterプランでのメモリ不足
発生した問題
- Railsアプリケーションの動作が極端に遅い(トロトロ状態)
- メモリ使用量が512MBの制限を超過
- アプリケーションが頻繁にメモリ不足でクラッシュ
一時的な対応
メモリ不足を解決するため、一時的に月額$25のプランにアップグレードしました。これにより動作は安定しましたが、ランニングコストが気になる状況でした。
解決策:メモリ使用量の最適化
メモリ使用量を削減するため、以下の4つの観点から最適化を実施しました。
1. データベースコネクションプールの調整
変更前
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
変更後
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 2 } %>
データベースコネクションプールのデフォルト値を5から2に削減しました。小規模なアプリケーションでは、多くのコネクションを保持する必要がないため、メモリ使用量を効率的に削減できます。
2. ログレベルの最適化
変更前
config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info")
変更後
config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "warn")
ログレベルをinfo
からwarn
に変更することで、不要なログ出力を減らし、I/O負荷とメモリ使用量を削減しました。
3. Webサーバーの設定調整
変更前
services:
- type: web
envVars:
- key: WEB_CONCURRENCY
value: 2
変更後
services:
- type: web
envVars:
- key: WEB_CONCURRENCY
value: 1
- key: RAILS_MAX_THREADS
value: 2
-
WEB_CONCURRENCY
を1に設定してワーカープロセス数を制限 -
RAILS_MAX_THREADS
を明示的に2に設定してスレッド数を制御
これにより、プロセス数を減らしてメモリ使用量を大幅に削減しました。
4. Gemの更新
bundle update
依存関係の更新により、メモリ効率の改善された新しいバージョンのgemを導入しました。
結果:劇的なメモリ使用量削減
メトリクス比較
最適化の結果、以下のような劇的な改善が得られました:
Render.comのApplication Metricsで確認したメモリ使用量の推移
最適化前
- メモリ使用量: 1,907.3 MB(ピーク時)
- 平均使用量: 約953.7 MB
- 512MBの制限を大幅に超過
最適化後
- メモリ使用量: 476.8 MB(ピーク時)
- 平均使用量: 約300-400 MB
- 512MBの制限内で安定動作
改善効果
- メモリ使用量: 約75%削減(1,907.3 MB → 476.8 MB)
- 月額コスト: $25 → $0(starterプランは無料枠)
- 年間コスト削減: $300
まとめ
Render.comでRailsアプリケーションを運用する際は、以下の最適化が効果的です:
- データベースコネクションプールの調整:小規模アプリでは2-3程度に制限
- ログレベルの最適化:不要なログ出力を削減
- Webサーバー設定の調整:プロセス数とスレッド数を適切に制限
- 依存関係の更新:メモリ効率の改善されたgemを使用
これらの最適化により、メモリ使用量を1/4に削減し、月額$25のコストを完全に削減することができました。小規模なRailsアプリケーションであれば、適切な設定でstarterプランでも十分に運用可能です。
メモリ使用量の最適化は、特に個人開発や小規模プロジェクトでのコスト削減に大きく貢献します。ぜひ参考にしてみてください!
Discussion