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
  • ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化
Advertisements
Tagged with: , , , , ,
Posted in aws, web

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 4 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 4 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 4 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 10 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: