Railsアプリを最小メモリで起動する
目的
メモリ2GB CPUコア3で複数のRailsアプリを「最小メモリ」でデプロイ。
1. Worker数でのメモリ調査
1-1. Unixドメインソケットを使用する方法
一般的な方法でunicorn.sock、puma.sockなどを使用します。
例 |
Nginx/Unicorn/Ruby on Railsの本番環境構築/デプロイ |
Nginx + Unicornで複数のRailsプロジェクトを実行する |
Nginx + Pumaで複数のRailsプロジェクトを実行する |
Unicronの結果
[サービスの起動]
unicorn -c /home/ユーザー名/myapp/config/unicorn.rb
状態 | 使用済みメモリ |
---|---|
停止時 | 400MB |
Worker1で起動 | 592MB |
Worker2で起動 | 677MB |
Worker3で起動 | 783MB |
Worker4で起動 | 951MB |
※調査の際のアクセス数が異なりますのであくまでも目安。
Pumaの結果
[サービスの起動]
puma -C /home/ユーザー名/myapp/config/puma.rb
状態 | 使用済みメモリ |
---|---|
停止時 | 400MB |
Worker1で起動 | 921MB |
Worker2で起動 | 969MB |
Worker3で起動 | 1188MB |
※調査の際のアクセス数が異なりますのであくまでも目安。
1-2. Unixドメインソケットを使用しない方法
いわゆる「bin/rails s」「bin/rails s -e production」と同様です。
<サービスファイルの作成>
sudo vi /usr/lib/systemd/system/rails-demo.service
[rails-demo.service]
[Unit] Description=Rails demo Server After=network.target [Service] User=ユーザー名 WorkingDirectory=/home/ユーザー名/プロジェクト名 ExecStart= /home/ユーザー名/.rbenv/shims/bundle exec puma -e production -p 3000 Restart=always [Install] WantedBy=multi-user.target
Restart=alwaysと定義しているので、何らかのエラーなどで落ちた場合は自動的に再起動します。 ※systemctl stopは除く。
/home/ユーザー名/.rbenv/shims/bundleのパスは次のコマンドで確認。
which bundle
<サービスの操作>
デーモンリロードは必ず実行して下さい。
// デーモンリロード sudo systemctl daemon-reload // 自動起動の設定(On) sudo systemctl enable rails-demo // 自動起動の設定(Off) sudo systemctl disable rails-demo // サービスの開始 sudo systemctl start rails-demo // サービスの停止 sudo systemctl stop rails-demo // サービスの状態 sudo systemctl status rails-demo // サービスのリスタート sudo systemctl restart rails-demo // サービスの一覧情報 sudo systemctl list-unit-files
<Nginxの設定>
location /rails-demo { try_files $uri @rails_demo_app; } location @rails_demo_app { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://localhost:3000; }
複数のプロジェクトを起動する場合は3000のポート番号を変更。
Unixドメインソケットを使用しない結果
状態 | 使用済みメモリ |
---|---|
停止時 | 400MB |
Worker数は0。masterで起動 | 470MB |
2. 実稼働でのメモリ調査
次の例ではPuma、Unicornで2つのプロジェクトを起動しています。
1行目はコマンド。3行目はUnixドメインソケットを使用しない方法(「bin/rails s」「bin/rails s -e production」と同様)。4-6行目はUnixドメインソケットを使用する方法でUnicornをWorker2で起動。
ps aux USER PID %CPU %MEM COMMAND xxx 1111 0.5 4.0 puma 1.2.3 (tcp://0.0.0.0:3000) [rails] xxx 1111 2.4 4.6 unicorn master -c /home/xxx/yyy/config/unicorn.rb xxx 1111 0.4 4.9 unicorn worker[0] -c /home/xxx/yyy/config/unicorn.rb xxx 1111 0.6 5.1 unicorn worker[1] -c /home/xxx/yyy/config/unicorn.rb
%MEMを計算すると次のようになります。
種類 | 使用済みメモリ |
---|---|
Puma | 73.48MB |
Unicon | 268.202MB |
3. 最終結果
Railsアプリを最小メモリで起動する方法は
(「bin/rails s」「bin/rails s -e production」と同様)
サーバーの使用メモリは50-100MBぐらいになります。その代わりに大規模アクセス、瞬間の集中的アクセスには弱いかも知れません。
安定性を求めるならば、Unixドメインソケットを使用する方法でUnicronのWorkerを1個か2個にすると良いです。Workerが2個でも1日1万PVは十分、耐えられます。※現在、Worker1個で試行中。
上記はあくまでも個人のプロジェクト用です。業務用プロジェクトはPuma/UnicornのWorker数は3/4で良いと思います。