Nginx以上に早いと噂のHTTPサーバー"h2o"をCentOSに導入、その後ベンチマーク結果を追記します。

ソースコードからビルドする必要があるのでDevelopment Tools等の事前準備をします。

# yum groupinstall “Development Tools”
# yum install curl curl-devel libarchive libarchive-devel expat expat-devel zlib zlib-devel openssl cname
# rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
↑参考URLではこのようになっているが、これを実行するとアクセスできないので(RepoForge ”旧RPMForge” 終了している)
以下を実施する for centos6.x
# yum install http://ftp.riken.jp/Linux/repoforge/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
# yum install libyaml-devel –enablerepo=rpmforge

参考ページ

h2o のソースコードをコンパイル。

# cd /usr/local/src
# git clone https://github.com/h2o/h2o.git
# cd h2o
# cmake -DWITH_BUNDLED_SSL=on .
# make h2o
# make install

makeに失敗するorz.
# make h2o
[ 0%] Built target bundled-ssl
(in /usr/local/src/h2o/deps/mruby)
rake aborted!
/usr/local/src/h2o/deps/mruby/lib/mruby/build/load_gems.rb:30:in `load’: /usr/local/src/h2o/deps/mruby/mrbgems/mruby-hash-ext/mrbgem.rake:5: syntax error, unexpected ‘:’, expecting kEND
spec.add_dependency ‘mruby-enum-ext’, core: ‘mruby-enum-ext’
^
/usr/local/src/h2o/deps/mruby/mrbgems/mruby-hash-ext/mrbgem.rake:6: syntax error, unexpected ‘:’, expecting kEND
spec.add_dependency ‘mruby-array-ext’, core: ‘mruby-array-ext’
^
/usr/local/src/h2o/deps/mruby/mrbgems/mruby-hash-ext/mrbgem.rake:7: syntax error, unexpected ‘:’, expecting kEND
…ency ‘mruby-enumerator’, core: ‘mruby-enumerator’
^
./Rakefile:17:in `load’
make[3]: *** [CMakeFiles/mruby] エラー 1
make[2]: *** [CMakeFiles/mruby.dir/all] エラー 2
make[1]: *** [CMakeFiles/h2o.dir/rule] エラー 2

rubyが分からないヘタレなので調査するのも時間がかかってしまうので古いものを探してインストール。

h2o v2.0.1をインストール
wget https://github.com/h2o/h2o/archive/v2.0.1.tar.gz
tar zxvfp v2.0.1.tar.gz
cd h2o-2.0.1/
cmake .
make
make install

 

サンプルのconfファイルをコピーする。
mkdir /usr/local/etc/h2o/
cp /usr/local/src/h2o-2.0.1/examples/h2o/h2o.conf /usr/local/etc/h2o/h2o.conf
vi /usr/local/etc/h2o/h2o.conf

 

h2o起動
sudo /usr/local/bin/h2o -m daemon -c /usr/local/etc/h2o/h2o.conf

h2o起動時のエラーでハマった点
failed to parse configuration file:/usr/local/etc/h2o/h2o.conf:line 25:did not find expected key
yaml データとしては invalid な形式になっていまして、以下のように3行目のスペースが1つ足りない。

confファイルのaccess-logの先頭に2個スペースが必要。
access-log: /var/log/h2o/access_log

参考ページ

再度チャレンジ
start_server (pid:4605) starting now…
No support for IPv6. Please update Perl (or Perl modules) at /usr/local/share/h2o/start_server line 8.

現在のstart_serverはIPv4のみをサポートしているので、設定ファイルのhost: 0.0.0.0を追記しておないと、h2oがIPv6もbindしようとするのでエラーになる様です。

修正ファイル:h2o.config

listen:
port: 80
host: 0.0.0.0

これで動いたので、Nginxよりどれくらい早いのかベンチマークしてみたいと思います。

 

yumでのインストールが出来ない物だと思ってましたが、今はyumでインストールできる様です。

参考ページ

 

追記します。

個人で契約しているしょぼいスペックのVPSでのベンチマークの結果を追記します。

wrkでベンチマーク
./wrk -t12 -c400 -d30s -H”User-Agent: MyBrowser” –latency –timeout 5 http://127.0.0.1:80/index.html
12 スレッド(-t12)
同時 400 コネクション(-c400)
負荷は 30 秒かける(-d30s)
リクエストヘッダー “User-Agent: MyBrowser” を送信(-H”User-Agent: MyBrowser”)
通信は5秒でタイムアウト(–timeout 5)
ベンチマーク結果にレイテンシの統計情報も表示(–Latency)
リクエスト先は http://127.0.0.1:80/index.html
ベンチマーク測定比較
12 スレッド(-t12)
同時 400 コネクション(-c400)
負荷は 30 秒かける(-d30s)
apache 2.2.15
——
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   255.58ms  669.32ms   4.97s    89.85%
    Req/Sec   584.49    255.50     1.81k    76.79%
  Latency Distribution
     50%   19.59ms
     75%   25.10ms
     90%  944.09ms
     99%    3.30s
  198146 requests in 30.10s, 87.49MB read
  Socket errors: connect 0, read 0, write 0, timeout 317
  Non-2xx or 3xx responses: 198146
Requests/sec:   6583.41
Transfer/sec:      2.91MB
nginx 1.12.1
——
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    87.07ms  189.24ms   3.70s    85.93%
    Req/Sec     2.05k     1.75k    7.59k    71.62%
  Latency Distribution
     50%    4.89ms
     75%    6.69ms
     90%  385.26ms
     99%  625.03ms
  616250 requests in 30.03s, 499.52MB read
  Socket errors: connect 0, read 19, write 0, timeout 26
Requests/sec:  20520.87
Transfer/sec:     16.63MB
h2o 2.2.2
——
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    10.64ms    9.59ms 230.51ms   99.30%
    Req/Sec     3.24k   271.35     4.16k    69.20%
  Latency Distribution
     50%   15.56ms
     75%   16.07ms
     90%   16.44ms
     99%   19.44ms
  1160268 requests in 30.03s, 454.78MB read
Requests/sec:  38632.60
Transfer/sec:     15.14MB
リクエスト数の比較グラフ h2oが圧倒的です。
 
転送/秒の比較 僅かにnginxに軍配があがりました。