apacheとnginxの性能比較
WebサーバーシェアNo1のapacheと最近話題のnginx。
この二つのwebサーバーについて、UNIXの基礎から学ぶことにより、性能や特性の違いを理解する。
目次
apache vs nginx 検証
1.前提
テスト対象のミドルウェア
・apache webサーバー
・nginx
apache webサーバーとnginxの最近のシェアについて
apacheはwebサーバーとして依然シェアNO.1であるが、アクセス数の多いサイトではnginxの採用が伸びている。
<netcraft>
webの流行りや傾向、研究を行っているイギリスの会社で、2015年4月にwebサーバーのシェア率を発表した。
apacheは長年シェア1位を獲得し続けているが、後発のwebサーバー「nginx」にシェアを奪われている。
◎ netcraft公式
◎ April 2016 Web Server Survey
apacheの仕組みについて
apacheは「MPM(Multi Processing Module)」というコアとなる部分のモジュールが3つあり、それぞれ特性が異なる。
顧客の要求により、3つのMPMから1つを選択する必要がある。
<prefork>
apacheインストール時のデフォルトのMPM。マルチプロセス、シングルスレッドで動作する。
スレッドセーフであるため、スレッドセーフでない機能(phpなど)を利用する場合はpreforkを使用する。
重要な設定パラメータが少ないので、アクセス数が少ないwebサイトや納期が短い案件などで利用価値がある。
<worker>
preforkのマルチスレッド版。マルチスレッド化によりpreforkよりパフォーマンスが向上している。
マルチスレッドのため、スレッドセーフでない機能(phpなど)は利用できない。
event_MPMが利用できない(apache2.0以下)がpreforkより性能を出したい場合に利用価値がある。
<event>
apache2.2ではβ版として実装され、2.4(2012年2月リリース)から正式版となったMPM。
KeepAlive(後述)処理改良版。よりパフォーマンスが向上している。
KeepAlive用のスレッドを用意することにより、各スレッドのKeepAliveのwait時間をなくしている。
最新のapacheをwebサーバーと使用して、最もパフォーマンスを出したい場合に利用価値がある。
<KeepAliveとは?>
同一のクライアントからのリクエストに対し、TCPコネクションを使い回す機能。
TCPコネクションの確立回数が減るのでパフォーマンスが向上するが、処理が終了したスレッドは同一クライアントからのリクエストを待つ(waitが発生)ためサーバー負荷が増える。
古いブラウザ(IE6)では挙動がおかしくなることがあるため、その場合はOFFにする(書籍より)。
※デフォルト値:ON
nginxについて
nginxは、apacheが抱える「C10K問題」に対応するために開発されたwebサーバー。
プロセス数はCPUのコア数に依存するためプロセス番号の枯渇が発生しない。
スレッド数はシングルスレッドで動作するためマルチスレッド化によるメモリの圧迫もない。
ただし、phpはCGI版(php用のプロセスで動作する)の適用が必要。
C10K問題とは
32bit 環境のUNIXのプロセス数の最大は32,768であり、10,000(10K)のリクエストは受け取れても100,000のリクエストはプロセスIDが枯渇してwebサーバーがパンクする問題を指す。64bit 環境のUNIXを使ったり(プロセス数の最大値の上昇)、スレッドを増やす(メモリ使用量の増大)などの力技で解決はできるが、根本の解決にならない。
イベント駆動、ノンブロッキングI/O
nginxの特徴は、プロセスのread()とwrite()をブロックしない(ノンブロッキング)で処理を進める仕組みになっていることである。
一般的な処理(ブロッキングI/O)では、あるプロセスで処理が始まった場合、そのプロセスは処理が終了するまで他の処理ができない。
しかし、ノンブロッキングにすることで他の処理を行えるため、プログラムの並行性を高めている。
赤線部分がサーバーがクライアントの処理待ちをしている。
この空き時間を利用して他の作業を並行して進めるのがノンブロッキングI/O。
※accept、read、writeはシステムコール
nginxの利用価値
同時アクセス数が多い、またはapacheよりも高速動作を要求される場合に利用価値が高い。
ただし、後発のwebサーバーのためお客様の納得を得るためには説明資料が多くなること予想される。
また、有識者が少ないため現場でのトラブルシューティングに工数を割く可能性が高い。
2.テスト方法
apache
代表的なパラメータを上下させてパラメータの作用と限界性能を調査する。
<参考>
◎ apache : Apache HTTP サーバ バージョン 2.4(公式)
◎ prefok : Apacheのチューニングメモ(nownabeさん)
◎ worker : Apache2 – worker MPM のプロセス&スレッド数のチューニング(drk7.jpさん)
◎ event : ApacheとNginxの性能比較でevent_mpmの本気を見た(松本亮介さん)
<prefork>
MaxClients | アクセス可能なクライアントの最大値 |
MinSpareServers | アイドルな子プロセスの最小値。アイドルなプロセスが少なすぎる場合にforkする。 |
MaxSpareServers | アイドルな子プロセスの最大値。アイドルなプロセスが多すぎる場合にkillする。 |
KeepAliveTimeout | KeepAliveの持続時間。今回はデフォルトの”15秒”に設定する。 |
<worker、event>
MaxClients | アクセス可能なクライアントの最大値 |
MinSpareThreads | アイドルなスレッドの最小値。アイドルなスレッドが少なすぎる場合に生成する。 |
MaxSpareThreads | アイドルなスレッドの最大値。アイドルなスレッドが多すぎる場合にkillする。 |
ThreadsPerChild | 各子プロセスで生成されるスレッド数。 |
KeepAliveTimeout | KeepAliveの持続時間。今回はデフォルトの”15秒”に設定する。 |
nginx
代表的なパラメータを上下させてパラメータの作用と限界性能を調査する。
<参考>
◎ nginx公式 : nginx
◎ ブログ : Nginxのパフォーマンステストの方法とチューニングのメモ
<nginx>
worker_processes | プロセス数。”auto”にすると自動的にcpuコア数になる。今回は”1″に設定してテストする。 |
tcp_nopush | 最も大きなパケットサイズで送信するか。ONにすると効率が良くなる。 |
open_file_cache | 1度開いたファイルの情報をキャッシュするか。 |
worker_conections | プロセスが同時に処理できるTCPコネクション数 |
worker_rlimit_nofile | プロセスが同時に処理できるファイルディスクプリンタの数 |
keepalive_timeout | KeepAliveの持続時間。今回はapacheに合わせて”15秒”に設定する。 |
テストツール
<ApacheBench>
同時アクセス数( -c )は可変値とする。
合計リクエスト数( -n )は10000に固定値とする。
コマンド例 : ab -c 10 -n 10000 <IPアドレス>:<ポート番号>/
実施方法
apache、nginxともにパラメータ、同時アクセス数、合計リクエスト数の1組み合わせにつき3回計測を行い、平均値を求める。
実施環境
3.検証結果
Apache preforkの性能検証
検証中
Apache workerの性能検証
検証中
Apache eventの性能検証
検証中
nginxの性能検証
検証中
4.まとめ
apache→最も普及しているサーバーであるため、既存環境との親和性が高く安定性が高い。
nginx →後発サーバーであるため、採用されている現場は少ない。今後の新規導入時の提案が見込まれる。
書籍やインターネットの情報から、以下のような関係が見える。
速度 prefork < worker < event < nginx
よって、以下のような提案のシナリオが考えられる。
改修/新規 | 公共性 | 規模(アクセス数) | ミドルウェア | 備考 |
インフラ・銀行/一般サイト | 低並高 | |||
改修案件 | インフラ・銀行 | 低 | apache prefork | KeepAlive OFF |
並 | apache worker | KeepAlive OFF | ||
高 | apache worker or event | KeepAlive OFF | ||
一般サイト | 低 | apache prefork or worker | ||
並 | apache worker or event | |||
高 | apache event or nginx | |||
新規案件 | インフラ・銀行 | 低 | apache prefork or worker | KeepAlive OFF |
並 | apache worker | KeepAlive OFF | ||
高 | apache worker or event | KeepAlive OFF | ||
一般サイト | 低 | apache worker | ||
並 | apache event | |||
高 | nginx |
5.今後の展望と課題
検証用テストツールの習得
下記の理由から、検証用のツールが必要と考える。
①サーバーのパラメータが増えるとテストケースが膨大になる。
②性能検証はwebサーバーの速度も重要だが、OSのCPU使用率やメモリ使用量も重要である。
③実行ケースとデータ収拾量が多いため、人間の手作業では時間がかかりすぎる。
UNIXの基本的な機能の学習
nginxはUNIXのシステムコールごとに処理の呼び出しがされるので、UNIXの知識が必要。
現状理解しているとは言えないため、さらなる学習が必要である。
各webサーバーで実装可能なセキュリティ系の検証
自社のサーバーで検証したため、セキュリティに関しては特に考慮していない。
実際の現場ではセキュリティ面の要求が必ずあるため、セキュリティの検証が必要。
(Basic認証、OpenSSL、DOS攻撃からの対応方法 等・・・)
高スペックサーバー環境によるwebサーバーの検証
nginxは高速処理を目的とているため、高スペックサーバー環境での検証は有意義である。
awsなどで複数台のサーバー、CPUでの検証を実施したい。
ログ出力機能の検証
ログのフォーマットや出方を検証
スマートフォン用サイトとの親和性の検証
今回はPCからのアクセスのみを想定。
スマートフォン用サイトを構築したい際の挙動を確認し、親和性を検証する必要がある。
ピーク性能を検証
ピーク時の性能を検証する必要がある。
6.参考
デフォルト設定での比較
configの設定をすべてデフォルトのままで性能比較。
同時接続数 | 単位 : 1秒あたりの処理リクエスト件数 | 備考 | |||
apache | nginx | ||||
prefork | worker | event | |||
100 | 957.402 | 935.228 | 855.126 | 2348.39 | |
150 | 898.284 | 987.192 | 877.216 | 2907.406 | |
200 | エラー | 931.514 | 592.124 | 2613.024 | |
300 | – | 733.388 | エラー | 1174.164 | |
400 | – | エラー | – | エラー | |
10,000 | – | – | – | – | C10K問題 |