Chrome の Developer Tools→Network→Timing にはリソース取得の各ステップにかかる時間が俯瞰できるようになっていて、このデータへアクセスする JavaScript API も用意されている。
諸般の事情により、これと同等のデータを cURL を使ってコマンドラインから取得する方法をメモ。
というか、必要なことは次のブログにまとめられている
Timing Details With cURL
https://josephscott.org/archives/2011/10/timing-details-with-curl/
cURL デフォルトの出力
cURL デフォルトの表示は以下のようになる(レスポンスデータは -o
オプションで /dev/null
に捨てる)
$ curl -o /dev/null http://www.nasa.gov/images/content/260989main_01_BuzzAldrinMoon_full.jpg % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 265k 100 265k 0 0 1523k 0 --:--:-- --:--:-- --:--:-- 1526k
プログレスバーは -s/--silent
オプションをつけると無効化できる。
$ curl -s -o /dev/null http://www.nasa.gov/images/content/260989main_01_BuzzAldrinMoon_full.jpg
出力のカスタマイズ
本題の出力メッセージのカスタマイズを行うには、フォーマットを記述したファイルを用意して -w/--write-out @format-file-name
というオプションをつければ良い。
$ cat curl-format time_namelookup: %{time_namelookup}\n time_connect: %{time_connect}\n time_appconnect: %{time_appconnect}\n time_starttransfer: %{time_starttransfer}\n ----------\n time_total: %{time_total}\n $ curl -s -o /dev/null -w @curl-format http://www.nasa.gov/images/content/260989main_01_BuzzAldrinMoon_full.jpg time_namelookup: 0.253 time_connect: 0.258 time_appconnect: 0.000 time_starttransfer: 0.269 ---------- time_total: 0.304
フォーマットの記述について
送受信の転送量やらHTTPレスポンスステータスやリダイレクト情報などいろいろな情報をとれるのだけど、Chrome にちかい指標は以下
- time_namelookup : DNS Lookup タイム
- time_connect Initial : Connection / Connecting
- time_appconnect : SSL ハンドシェイク
- time_starttransfer : Time To First Byte(TTFB)
- time_total : リクエストから終了までの時間
※単位はすべて秒
- 出力フォーマット全体をべちゃっとフォーマットファイルに記載
- 各種変数は
%{variable}%
と記述すると、実行結果で置換される - 改行,タブは
\n
,\t
を使う
当然ながら time_appconnect
は SSL 通信でしか発生しない。
先の例で URL を http から https へと SSL 通信にすると、 0 秒だった time_appconnect
が 0.247 秒かかっていることがわかる。
$ curl -s -o /dev/null -w @curl-format https://www.nasa.gov/images/content/260989main_01_BuzzAldrinMoon_full.jpg time_namelookup: 0.125 time_connect: 0.129 time_appconnect: 0.247 time_starttransfer: 0.271 ---------- time_total: 0.297
フォーマットの詳細は man ページの -w, --write-out
のセクションを参照
S3 バケットと CDN に対して計測
応用例として、AWS のサービスに対してレイテンシーを計測してみる。
異なるリージョンにある インターネット公開している S3 バケットと CloudFront(CDN)からコンテンツを取得すると、どのような結果になるのか?
- us-northeast-1(US Standard)
- ap-northeast-1(tokyo)
に S3 バケットを用意し、static web hosting させる。US Standard のバケットは CDN(CloudFront) と連携し、日本からそれぞれに対してレイテンシーを計測する。
S3(ap-northeast-1)
$ curl -o /dev/null -w @curl-format -s http://hello-world1.s3-website-ap-northeast-1.amazonaws.com/Lenna.png time_namelookup: 0.012 time_connect: 0.023 time_appconnect: 0.000 time_starttransfer: 0.083 ---------- time_total: 0.154 $ curl -o /dev/null -w @curl-format -s http://hello-world1.s3-website-ap-northeast-1.amazonaws.com/Lenna.png time_namelookup: 0.012 time_connect: 0.024 time_appconnect: 0.000 time_starttransfer: 0.059 ---------- time_total: 0.112
S3(US Standard)
$ curl -o /dev/null -w @curl-format -s http://hello-world2.s3-website-us-east-1.amazonaws.com/Lenna.png time_namelookup: 0.028 time_connect: 0.209 time_appconnect: 0.000 time_starttransfer: 0.782 ---------- time_total: 2.411 $ curl -o /dev/null -w @curl-format -s http://hello-world2.s3-website-us-east-1.amazonaws.com/Lenna.png time_namelookup: 0.028 time_connect: 0.204 time_appconnect: 0.000 time_starttransfer: 0.810 ---------- time_total: 1.929
S3(US Standard) + CDN
$ curl -o /dev/null -w @curl-format -s http://dummy.cloudfront.net/Lenna.png time_namelookup: 0.028 time_connect: 0.038 time_appconnect: 0.000 time_starttransfer: 0.046 ---------- time_total: 0.101 $ curl -o /dev/null -w @curl-format -s http://dummy.cloudfront.net/Lenna.png time_namelookup: 0.028 time_connect: 0.037 time_appconnect: 0.000 time_starttransfer: 0.046 ---------- time_total: 0.099
計測結果
日本からは遠い アメリカ本土のバケットも、CDN を使ってエッジサーバにアクセスさせることで
- time_connect
- time_starttransfer
が大幅に改善した。
CDN と東京リージョンのバケットでは性能的に大きな差がないので
- アクセス元が地域的に限定されている
- レスポンスタイムの要求がシビアでない
- USリージョンのバケットのことは忘れて良い
といった前提の上では、誤差のレベル。
「CloudFront からの転送料金」 > 「S3 からの転送料金」というサービス利用料を考慮すると、遠くのS3+CloudFront より 近くのS3 を選びたい。
あわせて読みたい
- Evaluating network performance – Google Chrome
https://developer.chrome.com/devtools/docs/network - ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化