cURLの出力結果をカスタマイズする

Chrome の Developer Tools→Network→Timing にはリソース取得の各ステップにかかる時間が俯瞰できるようになっていて、このデータへアクセスする JavaScript API も用意されている

chrome-timing

諸般の事情により、これと同等のデータを 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
  • ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化

Leave a comment