2016.05.23

  • 人×技術

Movable Type における Apache と Nginx + Starman の比較

はじめまして、ぬまおです。サーバーエンジニアやってます。
以前から Movable Type を使った案件はちょこちょこあり、WEBサーバーは Apache でやっておりました。
ただ Movable Type 5.2 から PSGI 対応にもなっているので、体感的に nginx + PSGI の方が速そう! ということで、どれだけ速いか検証してみました。
なお、今回 PSGI を動かすに当たっては Starman を使用しました。

そもそも Apache と nginx の違いって?

Apache はマルチプロセスモデルと言われ、クライアントからの接続毎にプロセスをフォークして処理します。 メモリ空間がプロセスごとに独立しているためスクリプト言語などを組み込みやすい反面、 同時接続数が増えると子プロセスが増え、リソース逼迫してしまうことがあります。
一方 nginx はイベント駆動モデルと言われ、指定したプロセス数(デフォルトは1)でクライアントからの接続毎にイベント処理を行います。 同時接続数が増えてもプロセス数、スレッド数が増えることがなくリソースを効率的に利用できるが、 メモリ空間を共有するためスクリプト言語などを組み込めない場合があります。
また、Apache には CGI を動かすためのモジュールが用意されていますが、nginx には同一プロセスで CGI を動かすためのモジュールはありません。 そこで、Starman という多機能PSGIサーバを別で起動しておき、CGI の処理は nginx を HTTPプロキシサーバーとして動作させ Starman に渡すことで CGI を動かします。

検証環境 (Xen)

OS : CentOS 7.2.1511 64bit
CPU : Intel(R) Xeon(R) CPU E5-2603 v3 @ 1.60GHz
MEM : 2GB

ミドルウェア / Movable Type

Apache : 2.4.6 (MPM prefork)
nginx : 1.8.1
Starman : 0.4014
Movable Type : 5.2.13

Apache はデフォルト設定
nginx は Starman へのリバースプロキシの部分以外はデフォルト設定

操作感の比較

早速ですが、操作感の比較です。
巷で言われている通り、Apache で Movable Type を動かすと全体的に動作が重いです。
一方 nginx + Starman は比較的スムーズに動作していて、下記の通りなかなかの差が出てます。

【ログイン】

Protocol Apache nginx + Starman
HTTP 0.8秒 0.3秒
HTTPS 1.1秒 0.5秒

 

【ページ遷移 (ダッシュボード→ブログ管理ページ) 】

Protocol Apache nginx + Starman
HTTP 2.2秒 1.3秒
HTTPS 2.9秒 1.9秒

操作感に関しては nginx + Starman の方が優れていますね。
続いて記事を作成した際の比較を見てみます。

想定パターン

  • 6人が同時に記事を5回作成

記事を作成と言っても、ブログ記事の作成から [タイトル] [本文] は空白のまま公開を押しただけの動作になります。
CGI を動かした際のリソース状況を見たいので、とりあえずはこれで大丈夫かと思います。

そして、上記想定を実行するためにこちらの FireFox のプラグインを使用します。

iMacros for Firefox
https://addons.mozilla.org/ja/firefox/addon/imacros-for-firefox/

これで一連の動作を記録して、ブラウザを6個立ち上げて5回動作を繰り返します。

上記想定パターンでの比較

コア数を 1CORE 2CORE 4CORE の3パターンで比較してみます。nginx のワーカー数は CORE数と同じに設定の上検証します。
また、HTTP と HTTPS それぞれで検証を行いましたが、結果に大差がなかったので HTTPS の結果のみ載せます。
※Starman のプロセス数は 4 で動かしてます。

1CORE

まずは 1CORE
全部の処理が完了するまでにかかった時間は以下の通り

Protocol Apache nginx + Starman
HTTPS 3分36秒 2分05秒

1CORE では圧倒的に nginx + Starman の方が速いです。
リソースに関しては以下の通り

CPU使用率

Apache が 90% 前後に張り付いているのに対し、nginx + Starman は CPU を専有することなく処理できています。

メモリ使用率

Apache が 15% ~ 30% で推移しているのに対し、nginx + Starman は 40% 辺りで頭打ちとなりそのまま推移しています。
Starman は立ち上げたプロセス毎にモジュールのロードを行うので、プロセス数に応じて一定のメモリを消費してしまうようです。

ロードアベレージ

Apache が 5.77 、nginx + Starman は 2.56 となり負荷としては約半分になっています。

2CORE

続いて 2CORE
全部の処理が完了するまでにかかった時間は以下の通り

Protocol Apache nginx + Starman
HTTPS 2分20秒 2分00秒

Apache の処理速度が急激に上がりました。nginx + Starman の方も若干速くなっていますね。
リソースに関しては以下の通り

CPU使用率

Apache、nginx + Starman 共に 1CORE の時と比べると使用率が下がりました。

メモリ使用率

こちらは 1CORE の時と同様で、nginx + Starman より Apache の方がメモリ使用率が低くなっています。

ロードアベレージ

双方とも 2COREにしたことで負荷が下がっていますが、処理終了時の値は nginx + Starman の方が半分以下に抑えられています。

4CORE

最後に 4CORE
全部の処理が完了するまでにかかった時間は以下の通り

Protocol Apache nginx + Starman
HTTPS 2分18秒 1分52秒

Apache は 2CORE の時とほぼ変わらず、nginx + Starman は数秒速くなりました。
リソースに関しては以下の通り

CPU使用率

Apache、nginx + Starman 共に 2CORE の時と比べるとさらに使用率が下がりました。

メモリ使用率

1CORE、2CORE の時と同様で、nginx + Starman より Apache の方がメモリ使用率が低くなっています。

ロードアベレージ

双方とも 4COREにしたことで負荷が下がっていますが、nginx + Starman はほぼ 1 以下で推移するようになりました。

nginx + Starman の消費メモリについて

全体を通して nginx + Starman はメモリを多く専有してしまうのがネックとなりますが、
Starman 起動時に --preload-app オプションをつけることで、親プロセスに読み込んだメモリを子プロセスに共有してくれるので、メモリの消費を抑えることが出来ます。

オプションをつけた場合とつけない場合のメモリの使用率の比較は以下の通り。
※4CORE で上記と同様の想定パターン

20%程度使用率を抑えられましたね。

まとめ

記事作成において、全体を通して nginx + Starman の方が処理速度が速く、ロードアベレージも抑えられました。 1CORE の時は、処理速度に大きな差が出たので、十分なリソースが確保出来ない場合には、nginx + Starman の方がより有効性が高いです。
メモリを多く消費してしまう傾向がありますが、オプションを使うことである程度は抑えられるので、
操作感含めて考えても nginx + Starman の方が Movable Type を動作させる環境としては適していると感じました。

この記事を書いた人 :
ぬまお

この記事をシェアする

すべての記事