WordPress を https と http で h2load を用いたベンチマークをしてみた

スポンサーリンク

 http で動かしているホストと https で SSL/TLS 通信を行うときでは、1 秒間に捌けるリクエスト数にどの程度の差があるのかと気になった。
 検証環境にこのブログである「ぶっちろぐ」をまるっとコピーして http と https それぞれで動作させて h2load を実行してみた。

動作環境

 Web Server は Nginx で Reverse Proxy 設定をし、Proxy Cache を効かせることを前提とする。PHP 7 は PHP-FPM を噛まして動作。RDBMS は MariaDB とする。
 Nginx は稼働ホストの CPU 性能に合わせる為に worker_processes を 3 にまで落としている。

HTTP でベンチマーク

 h2load で HTTP/1.1 を用いるには –h1 を引数に与えると良い。確か h2load 自体が古いと HTTP/1.1 非対応だったはずなので新しい奴をビルドした方が良い。

$ h2load --version
h2load nghttp2/1.5.1-DEV
$ h2load --h1 -n 10000 -c 100 -m 100 http://blog.example.com/
starting benchmark...
spawning thread #0: 100 total client(s). 10000 total requests
Application protocol: http/1.1
progress: 10% done
(中略
progress: 100% done

finished in 608.14ms, 16443.61 req/s, 1.18GB/s
requests: 10000 total, 10000 started, 10000 done, 10000 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 10000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 772204800 bytes total, 2749500 bytes headers (space savings 0.00%), 769450000 bytes data
                     min         max         mean         sd        +/- sd
time for request:     7.87ms    597.05ms    308.66ms    168.18ms    57.96%
time for connect:     1.54ms      9.14ms      5.63ms      1.99ms    65.00%
time to 1st byte:     9.36ms    384.22ms    146.13ms    177.35ms    64.00%
req/s (client)  :     165.22      264.09      225.92       46.34    64.00%

 秒間あたりに捌いたリクエスト数は 16443.61 req/s にもなった。

HTTPS でベンチマーク

$ h2load -n 10000 -c 100 -m 100 https://blog.example.com/
starting benchmark...
spawning thread #0: 100 total client(s). 10000 total requests
TLS Protocol: TLSv1.2
Cipher: ECDHE-RSA-AES128-GCM-SHA256
Application protocol: h2
progress: 10% done
(中略
progress: 100% done

finished in 2.35s, 4259.31 req/s, 315.60MB/s
requests: 10000 total, 10000 started, 10000 done, 10000 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 10000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 776954900 bytes total, 2640000 bytes headers (space savings 4.35%), 773770000 bytes data
                     min         max         mean         sd        +/- sd
time for request:    55.92ms       1.98s       1.01s    555.16ms    57.92%
time for connect:   310.86ms    366.49ms    337.89ms     16.53ms    59.00%
time to 1st byte:   366.82ms       2.32s       1.34s    571.58ms    57.00%
req/s (client)  :      42.65      259.12       93.22       52.52    84.00%

 HTTPS (HTTP/2) の場合では 4259.31 req/s になった。

まとめ

 単純に秒間あたりに捌けるリクエスト数は HTTPS : HTTP = 1 : 3.86 という結果になった。
 SNI を用いているので、サーバーは平文でホスト名を受けとったあとに証明書を投げてブラウザが検証。完了して TLS でネゴして暗号化し、ブラウザは公開鍵を元に復号してレンダリングとなるハズだが、この処理の重さでここまで捌ける数が減る物なのだなと数値で見て取れた。
 今回のテストは、回線帯域が絶対に不足するってレベルになるので Nginx が動作しているホスト上で行った。

 とにかく軽さというか捌ける数を取るか、SSL/TLS 通信による暗号化経路で閲覧者を安心させるかの二択になるのかな。両方を実現するには Web Server を複数台用意してロードバランサ通すなりして負荷分散しないと無理そうかな。

スポンサーリンク