ホーム > カテゴリ > Ruby・Ruby on Rails >

Railsアプリを最小メモリで起動する

CentOSで各種サーバー構築(目次)

目的

メモリ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を計算すると次のようになります。

種類使用済みメモリ
Puma73.48MB
Unicon268.202MB

3. 最終結果

Railsアプリを最小メモリで起動する方法は

Unixドメインソケットを使用しない
(「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で良いと思います。





関連記事



公開日:2019年10月03日 最終更新日:2019年12月13日
記事NO:02784