画像やリンクが無効になっている可能性もあるのでご了承下さい。
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 を複数台用意してロードバランサ通すなりして負荷分散しないと無理そうかな。
コメント