確認スクリプト
while ループで、現在の時刻を表示しながら、2秒インターバルで curl コマンドを実行するスクリプトを作成しました
while true; do
echo -n '['`date '+%Y/%m/%d %T'`'] '
curl -s -o /dev/null -w "\
%{time_namelookup} \
%{time_connect} \
%{time_appconnect} \
%{time_pretransfer} \
%{time_starttransfer} \
%{time_total} \
%{remote_ip}\n" https://example.com/
sleep 2
done
使用している curl のオプションは以下のとおりです
-
-s
: curl の進捗情報やエラーを表示しない -
-o /dev/null
: レスポンスの内容を表示しない -
-w
: curl の出力形式を指定(詳細は以下)
-w
オプションの引数です。単位はすべて秒で、コマンドの実行開始からの経過時間を出力します
-
%{time_namelookup}
: DNS 名前解決が完了するまでにかかった時間 -
%{time_connect}
: サーバーへの TCP 接続が完了するまでにかかった時間 -
%{time_appconnect}
: サーバーへの TLS 接続が完了するまでにかかった時間 -
%{time_pretransfer}
: リクエスト送信が開始されるまでにかかった時間 -
%{time_starttransfer}
: レスポンスの最初のバイトを受信するまでにかかった時間 -
%{time_total}
: レスポンスの受信が終わるまでにかかった時間 -
%{remote_ip}
: 接続先の IP アドレス
なお、example.com は HTTPS ( https://example.com/ ) でも HTTP ( http://example.com/ ) でもアクセスできるようになっています。CDN に乗っているようです。
コマンドの実行結果: https 編
簡単に10秒間だけ実行してみます
[2023/05/09 18:45:41] 0.004255 0.122943 0.382825 0.382982 0.504497 0.504939 93.184.216.34
[2023/05/09 18:45:43] 0.008665 0.126337 0.389283 0.389374 0.515294 0.515694 93.184.216.34
[2023/05/09 18:45:46] 0.006952 0.160491 0.456443 0.456597 0.575058 0.575518 93.184.216.34
[2023/05/09 18:45:48] 0.009867 0.127739 0.388252 0.388389 0.507338 0.507515 93.184.216.34
[2023/05/09 18:45:51] 0.008886 0.133743 0.400165 0.400278 0.521013 0.521195 93.184.216.34
なお、HTTP/2 での接続になっていました
コマンドの実行結果: http 編
スクリプトのこちらの行を、https → http に変更して実行します
-%{remote_ip}\n" https://example.com/
+%{remote_ip}\n" http://example.com/
こちらも5回分だけ実行してみます
[2023/05/09 18:45:57] 0.009565 0.130113 0.000000 0.130274 0.252637 0.253150 93.184.216.34
[2023/05/09 18:45:59] 0.008010 0.125504 0.000000 0.125960 0.242670 0.243096 93.184.216.34
[2023/05/09 18:46:01] 0.008424 0.130206 0.000000 0.130604 0.252498 0.252901 93.184.216.34
[2023/05/09 18:46:04] 0.008872 0.127002 0.000000 0.127096 0.245600 0.246088 93.184.216.34
[2023/05/09 18:46:06] 0.007377 0.128108 0.000000 0.128185 0.249296 0.249794 93.184.216.34
http では TLS 接続のステップがないため、time_appconnect
が省略されて0になっています
結果の比較
それぞれ5回分の平均値をとり、比較してみます。単位はミリ秒に直しています
namelookup | connect | appconnect | pretransfer | starttransfer | total | |
---|---|---|---|---|---|---|
(1) https | 7.725 | 134.251 | 403.394 | 403.524 | 524.640 | 524.972 |
(2) http | 8.450 | 128.187 | - | 128.424 | 248.540 | 249.006 |
(1) - (2) | -0.725 | 6.064 | - | 275.100 | 276.100 | 275.966 |
誤差もあるはずですが、http の場合 TLS の処理 appconnect
がない分、https よりも pretransfer
まで200ミリ秒以上早く、total では2倍くらいの差が出ました
実際のブラウザによるアクセスなどのユースケースでは、
- 今回の実験よりもレスポンスのサイズが大きいことが多いと考えられるため、レスポンスのダウンロードにかかる時間のほうが支配的になるはず
- 複数のリクエストにまたがる場合にセッションが維持されることが多いと考えられるため、全体からすると
connect
,appconnect
にかかる時間の割合は減っていくはず
など考えられますが、curl で簡易的な調査をする際には役立つことがあります