🚀

Render.comでRailsアプリのメモリ使用量を1/4に削減してstarterプランで運用する方法

に公開

はじめに

Render.comでRailsアプリケーションをデプロイしようとした際、starterプラン(512MB)ではメモリ不足でアプリが正常に動作せず、月額$25のプランにアップグレードすることになりました。

しかし、適切な最適化を行うことで、メモリ使用量を大幅に削減し、starterプランでも快適に動作させることができるようになりました。この記事では、その具体的な方法とコスト削減効果について解説します。

問題:starterプランでのメモリ不足

発生した問題

  • Railsアプリケーションの動作が極端に遅い(トロトロ状態)
  • メモリ使用量が512MBの制限を超過
  • アプリケーションが頻繁にメモリ不足でクラッシュ

一時的な対応

メモリ不足を解決するため、一時的に月額$25のプランにアップグレードしました。これにより動作は安定しましたが、ランニングコストが気になる状況でした。

解決策:メモリ使用量の最適化

メモリ使用量を削減するため、以下の4つの観点から最適化を実施しました。

1. データベースコネクションプールの調整

変更前

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

変更後

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 2 } %>

データベースコネクションプールのデフォルト値を5から2に削減しました。小規模なアプリケーションでは、多くのコネクションを保持する必要がないため、メモリ使用量を効率的に削減できます。

2. ログレベルの最適化

変更前

config/environments/production.rb
config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info")

変更後

config/environments/production.rb
config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "warn")

ログレベルをinfoからwarnに変更することで、不要なログ出力を減らし、I/O負荷とメモリ使用量を削減しました。

3. Webサーバーの設定調整

変更前

render.yaml
services:
  - type: web
    envVars:
      - key: WEB_CONCURRENCY
        value: 2

変更後

render.yaml
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アプリケーションを運用する際は、以下の最適化が効果的です:

  1. データベースコネクションプールの調整:小規模アプリでは2-3程度に制限
  2. ログレベルの最適化:不要なログ出力を削減
  3. Webサーバー設定の調整:プロセス数とスレッド数を適切に制限
  4. 依存関係の更新:メモリ効率の改善されたgemを使用

これらの最適化により、メモリ使用量を1/4に削減し、月額$25のコストを完全に削減することができました。小規模なRailsアプリケーションであれば、適切な設定でstarterプランでも十分に運用可能です。

メモリ使用量の最適化は、特に個人開発や小規模プロジェクトでのコスト削減に大きく貢献します。ぜひ参考にしてみてください!

Discussion