cookieのサイズはパフォーマンスに影響を与えるか

私は "回線が早くなった現在、データの転送よりもコネクションの確立にかかるオーバーヘッドの方が大きい" という根拠のない信念を持っています。
だから、今ではバイト数を節約するよりも、Vitamin Features » Serving JavaScript Fast のような方法でコネクションを抑えることのほうが速度的には効果があるだろう、考えていました。

そんなところに おぎろぐはてな - Cookieがパフォーマンスに与える影響 経由で Performance Research, Part 3: When the Cookie Crumbles » Yahoo! User Interface Blog に、クッキー500バイトでレスポンスを15ms改善できるという記事を見つけて、単純に500バイトを15msで割ったら300Kbps程度で日本じゃあり得ない遅さですが、小さいファイルの場合は回線の論理的なスループットはヘッダやスロースタートの影響で意味を持たないですし、いい機会なので定量的にコネクション確立にかかる時間とデータ転送にかかる時間とを調べてみました。

アメリカにある(とおもわれる)googleのサーバと、日本にあるヤフーのサイズの異なる3つの画像で、コネクションの確立までにかかる時間と、ファイルを取得するのにかかる時間を、自分が個人的に借りているサーバで測定しました。ウェブサーバが動いているサーバなため、評価環境として適切でないのですが値のトレンドはつかめるでしょう。

以下がテストに使ったURLです。bodyがContent-Lengthで、headerがHTTPのレスポンスヘッダ(クッキーを含む)をです。

googleのロゴ
body 8,558byte + header 206byte (www.google.com)
googleのメールアイコン
body 115byte + header 205byte (www.google.com)
ヤフーのnew!
body 111byte + header 714byte (i.yimg.jp)
ヤフーオークションのバナー
body 13,001byte + header 719byte (i.yimg.jp)
ヤフーのトップロゴ
body 15,470byte + header 699byte (i.yimg.jp)
ヤフーの特集タイトル
body 30,520byte + header 703byte (i.yimg.jp)


googleの画像もテストに入れているのは、ちょうど"日本からだと重たいflickrが二ユーヨークだと快適!"という話を聞いて、ついでにサーバとの物理的距離がコネクション確立までの時間にどれくらい影響するかのだいたいの値を見てみようと思ったからです。

curlはこういうちょこっと時間がはかりたいときに便利です。

curl --user-agent  "Mozilla/5.0" -s -o q -w  \
"time_namelookup:\t%{time_namelookup}\n"\
"time_connect:\t%{time_connect}\n"\
"time_starttransfer:\t%{time_starttransfer}\n"\
"time_total:\t%{time_total}\n"\
    http://i.yimg.jp/images/new2.gif


として実行すると、名前解決、コネクション確立、転送開始、転送終了までにかかる時間をmsの粒度ではかることができます。
それぞれのパラメータの意味は以下の通りです。

time_namelookup
実行開始から名前解決までに要した時間です。はじめの一回は実際にDNSサーバにリクエストが送られるので時間がかかりますが、二回目以降はOSでキャッシュされるので数msのオーダーです。
time_connect
実行開始からTCPコネクションがESTABLISHEDになるまでにかかった時間です。だいたいサーバとのラウンドトリップタイムになります。
time_starttransfer
実行開始から、サーバから送られてきた最初の1バイトを受信するまでにかかった時間です。わかりにくいですが、たぶんcurlの内部ではじめのread()から戻ってきたときの時間だと思います。
time_total
実行開始から、転送終了までにかかった時間です。リクエストしたファイルがTCPのパケットひとつ分におさまる程度に小さい(1kバイト前後?)だと、最初の1バイト目が届いたときには最後の1バイトも届いているので time_starttransfer と time_total は同じになります。(厳密にはコネクションを閉じる処理なんかが終わった後の時間だと思いますが、そのオーバーヘッドは無視できるくらいに小さいようです)


それぞれのURLについて5秒間隔で64回測定し、平均を取ってまとめたのが以下の表です。

URL time_namelookup time_connect time_starttransfer time_total
googleのロゴ(8.5k+0.2k) 1.9ms 9.1ms 67.4ms 91.3ms
googleのメールアイコン(115+205) 6.0ms 16.3ms 78.3ms 78.5ms
ヤフーのnew!(111+713) 3.7ms 12.0ms 21.7ms 22.0ms
ヤフーオークションのバナー(13.0k+0.7k) 3.4ms 11.0ms 23.8ms 46.0ms
ヤフーのトップロゴ(15.4k+0.7k) 3.7ms 13.0ms 24.4ms 50.3ms
ヤフーの特集タイトル(30.5k+0.5k) 4.0ms 12.3ms 39.1ms 81.8ms

表からわかること

time_namelookup, time_connect を見ると、物理的な距離はコネクション確立までにかかる時間に大きな影響は与えないようです。(そもそもウェブサーバとして動いているサーバの裏で評価をとっているため、msひとけたレベルの数字はディスクアクセスひとつでふきとんでしまいます....) googleの画像は、距離の問題なのか、サーバのレスポンスが悪いのか、いろんな要素がからんでいるのでこの結果からは何ともいえませんが、はじめの1バイトがくるまでに時間がかかっています。

コネクション確立までには15ms程度かかっています。実際に転送するファイルにもよるので、コネクションの確立がファイルの転送のうちどの程度の時間をしめているか一概にはいえませんが、例としてscript.aculo.usのファイルを見てみると、6つのファイルで103kバイトになっています。平均を取って17kバイトのファイルを考えると、転送時間の25%程度はコネクションの確立に使われることになります。実際にブラウザとサーバ間で転送されるときにはHTTP/1.1の persistent connection のおかげで、デフォルトではひとつのコネクションで5つのリクエストを処理してもらえるのでこの割合は5%まで下がると考えていいかもしれません。

googleのメールアイコンや、ヤフーのnew!のように、要求したファイルのサイズが十分に小さい場合は、最初の1バイトが届いたときに転送が完了します。一定の範囲(おそらくTCPのパケットサイズ)内ではファイルサイズが増えても転送時間には影響しません。ヤフーのnew!の場合 time_starttransfer が time_connect のほぼ倍になっていることから、サーバがレスポンスを返すまでの時間が数msレベルだと予想されます。

ヤフーの3つの画像のサイズの差とtime_totalの差とから、割り算をしてmsあたりの単純な転送量を計算すると、だいたい3Mbpsになっています。Yahoo UI blog の300Kbpsの10倍になっているので、サイズを節約して得られるインパクトは1/10になります。

結論

cookieのサイズはたしかに転送速度に影響を与え、小さくすると転送速度が改善されますが、回線の早い日本では全体から見ると無視できるレベルでしょう。HTTPのレスポンスヘッダが意外に大きかったりするので、cookieと一緒にヘッダを小さくするものいいでしょう。

実際にサイトを運用している状態では、サイト内で共通に使われている静的な画像やスクリプトファイルに対するリクエストは、ブラウザにキャッシュされるため 304 Not Modified を返すことがほとんどです。このときヘッダのサイズがひとつのTCPパケットに収まるサイズであれば、ラウンドトリップタイムの2倍の時間で転送が終了するのに、ヘッダが少し大きくてTCPのパケットサイズを超えてしまうと3倍(もしくはそれ以上)の転送時間がかかってしまいます。全体のパフォーマンス改善に対して意味があるほどのものかわかりませんが、気持ちとしてもったいないのでcookieを含めたヘッダを小さくするといいことがある、というのは新しい発見でした。

コネクション確立にかかる時間はそれほど大きくなく(自分は100msオーダーだと思っていました)、それも HTTP/1.1の persistent connection が有効であれば Keep-Alive の設定に応じて軽減されるので、ファイル数を減らすことはデータの転送時間という観点からは重要ではなさそうです。(ですが、レンダリング完了までにかかる時間にはおそらく大きく影響しています)

tags

  • experiments
  • 「cookieのサイズはパフォーマンスに影響を与えるか」のはてなブックマーク数
  • 「cookieのサイズはパフォーマンスに影響を与えるか」deliciousブックマーク数
  • 「cookieのサイズはパフォーマンスに影響を与えるか」をはてなブックマークに追加
  • save "cookieのサイズはパフォーマンスに影響を与えるか" to del.icio.us
  • 「cookieのサイズはパフォーマンスに影響を与えるか」をリアルタイムブログ検索
  • permalink
  • FirefoxのhtmlparserをXPCOM経由で呼び出して壊れたHTMLを修復する
  • FirefoxのHTMLパーサを使って壊れたHTMLを修復する PHP extension

comments

TypeKey Enabled
スタイル用のHTMLタグが使えます。
*required

trackbacks

トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。

http://labs.gmo.jp/mt/mt-tb.cgi/106
©2010 Kentaro Kumagai, GMO Internet Labs., GMO Internet, inc.
bits and bytes
2007 .03. 06 23:26

tagcloud

  • API1
  • C/C++2
  • E4X1
  • FUSE2
  • Firefox24
  • HTML4
  • IE1
  • MySQL1
  • OSX4
  • Opera2
  • PHP4
  • UI2
  • XML1
  • XPCOM4
  • XPath4
  • apache2
  • binary2
  • book1
  • data13
  • debug5
  • design1
  • experiments3
  • extension13
  • google gears1
  • google maps API1
  • greasemonkey4
  • httpd5
  • javascript19
  • linux1
  • logging2
  • mobile3
  • perl4
  • tips5
  • tool11
  • vim2
  • visualization3
  • widget1
  • wii2
  • windows7
  • サービス7
  • 和訳1

Archives

  • 2008.04 (3)
  • 2008.03 (4)
  • 2008.02 (6)
  • 2008.01 (3)
  • 2007.12 (4)
  • 2007.11 (5)
  • 2007.10 (4)
  • 2007.09 (4)
  • 2007.08 (4)
  • 2007.07 (8)
  • 2007.06 (7)
  • 2007.05 (4)
  • 2007.04 (5)
  • 2007.03 (6)
  • 2007.02 (4)
  • 2007.01 (6)

about

  • bits and bytesのXML
  • 「bits and bytes」のCreative Commons
  • Powered by Movable Type
  • イベントと地図 - モグ
  • Use ecto to blog!
  • bits and bytesのはてなブックマーク数
  • bits and bytesをMy Yahoo!に追加
  • Subscribe with Bloglines