私は "回線が早くなった現在、データの転送よりもコネクションの確立にかかるオーバーヘッドの方が大きい" という根拠のない信念を持っています。
だから、今ではバイト数を節約するよりも、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の画像もテストに入れているのは、ちょうど"日本からだと重たい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の粒度ではかることができます。
それぞれのパラメータの意味は以下の通りです。
それぞれの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 |
コネクション確立までには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になります。
実際にサイトを運用している状態では、サイト内で共通に使われている静的な画像やスクリプトファイルに対するリクエストは、ブラウザにキャッシュされるため 304 Not Modified を返すことがほとんどです。このときヘッダのサイズがひとつのTCPパケットに収まるサイズであれば、ラウンドトリップタイムの2倍の時間で転送が終了するのに、ヘッダが少し大きくてTCPのパケットサイズを超えてしまうと3倍(もしくはそれ以上)の転送時間がかかってしまいます。全体のパフォーマンス改善に対して意味があるほどのものかわかりませんが、気持ちとしてもったいないのでcookieを含めたヘッダを小さくするといいことがある、というのは新しい発見でした。
コネクション確立にかかる時間はそれほど大きくなく(自分は100msオーダーだと思っていました)、それも HTTP/1.1の persistent connection が有効であれば Keep-Alive の設定に応じて軽減されるので、ファイル数を減らすことはデータの転送時間という観点からは重要ではなさそうです。(ですが、レンダリング完了までにかかる時間にはおそらく大きく影響しています)
トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。
http://labs.gmo.jp/mt/mt-tb.cgi/106
comments