256bitの殺人メニュー

インフラエンジニアだったソリューションアーキテクトなくわののブログ。こちらのBlogは個人の意見となっていて会社とは全く関係ありません。お約束です。[twitter:@kuwa_tw]めんどくさがりが重い腰を上げて何かをアウトプットすることにどれほどの意味があるのかを試してみたいブログでもある。

curlでボトルネック調査をする

ますだっくすさんが

curlのエントリ書いてたのでおいらも1つだけ追記しませう。

Webサイトのボトルネック調査

あるサイトでアクセスが遅いなぁ、って話になったときにまず当たりをつけるために遅い部分を調べたい。
って時のcurlの使い方。

実際の手順

基本的には、前述のますだっく(@)さんの、「その3. レスポンスの出力を加工する」であるのですが、詳細な項目を設定することで問題の切り分けにも使用できます。

出力フォーマット用のファイル。
cat <<'EOF' >/tmp/curl_env.txt
url_effective\t\t: %{url_effective}\n
http_code\t\t: %{http_code}\n
http_connect\t\t: %{http_connect}\n
time_total\t\t: %{time_total}\n
time_namelookup\t\t: %{time_namelookup}\n
time_connect\t\t: %{time_connect}\n
time_appconnect\t\t: %{time_appconnect}\n
time_pretransfer\t\t: %{time_pretransfer}\n
time_redirect\t\t: %{time_redirect}\n
time_starttransfer\t\t: %{time_starttransfer}\n
size_download\t\t: %{size_download}\n
size_upload\t\t: %{size_upload}\n
size_header\t\t: %{size_header}\n
size_request\t\t: %{size_request}\n
speed_download\t\t: %{speed_download}\n
speed_upload\t\t: %{speed_upload}
EOF
サイトアクセスと結果出力
$ curl  -o /dev/null http://www.example.com -w @/tmp/curl_env.txt -s
url_effective		: http://www.example.com
http_code		: 200
http_connect		: 000
time_total		: 5.113
time_namelookup		: 5.083
time_connect		: 5.092
time_appconnect		: 0.000
time_pretransfer		: 0.000
time_redirect		: 0.000
time_starttransfer		: 5.102
size_download		: 6435
size_upload		: 0
size_header		: 328
size_request		: 177
speed_download		: 1258.000

この場合

DNSのルックアップに時間がかかってるので、そこを改善しましょう、と言う話になります。
ほかにも、time_starttransferが大きければアプリケーションかな?などの切り分けに使えます。

各項目の意味

他にもこんな項目がありますよ。
manページから抜粋。

url_effective		最後にアクセスした URL 。特に curl に対し location: ヘッダに従うように指示した場合に有意になるものです。
http_code			直前の HTTP(S) あるいは FTP(s) 転送から取得された応答コード。 7.18.2 以降では同じ情報を示す response_code がエイリアスとして利用可能になりました。
http_connect		curl による CONNECT リクエストに対する(プロクシからの)最後の応答コード。(7.12.4 以降)
time_total			全体の処理にかかった時間(秒)。表示精度はミリ秒単位。
time_namelookup		開始から名前解決が完了したときまでの時間(秒)。
time_connect		開始からリモートのホスト(またはプロクシ)への TCP 接続完了までの時間(秒)
time_appconnect		開始からリモートホストへの SSL/SSH/etc 接続/ハンドシェイク完了までの時間(秒)(7.19.0 以降)
time_pretransfer	開始から最初のバイトの転送が行われようとするまでの時間(秒)。転送前になされるべきコマンドやプロトコル特有のネゴシエーションも含まれる。
time_redirect		正引き(名前解決), 接続, 前段転送処理, 最終的なトランザクションが開始される前の転送を含む、すべてのリダイレクションの段階に要した時間(秒)を表す。この変数は一連のリダイレクション全体に要した時間を表す。(7.12.3 以降)
time_starttransfer	開始から最初のバイトが転送されるまでの時間(秒)。 time_pretransfer に加えてサーバが結果を算出するのに要した時間も含まれる。
size_download		ダウンロードされた総バイト数。
size_upload			アップロードされた総バイト数。
size_header			ダウンロードされたヘッダの総バイト数。
size_request		送信された HTTP リクエストの総バイト数。
speed_download		curl により測定されたダウンロード完了までの平均ダウンロード速度。バイト数/秒。
speed_upload		curl により測定されたアップロード完了までの平均アップロード速度。バイト数/秒。
content_type		(存在するなら)リクエストした文書の内容型。
num_connects		直前の転送による新規接続数。(7.12.3 以降)
num_redirects		リクエストに応じて行われたリダイレクトの回数。(7.12.3 以降)
redirect_url		リダイレクト追跡の -L を用いずにHTTP リクエストを生成した場合、実際のリダイレクト先になるものとされる URL がこの変数に示される。 (7.18.2 以降)
ftp_entry_path		リモート FTP サーバにログインしたときに libcurl により最初に辿り着いたパス。(7.15.4 以降)
ssl_verify_result	リクエストされた SSL ピア証明書の検証結果。 0 は検証の成功を意味する。(7.19.0 以降)

いじょー。

curl高機能すぎて書き始めると色々大変になってきますw
manなど色々見ながら使ってみてくださいませね。


明治 カールチーズあじ 72g×10個

明治 カールチーズあじ 72g×10個