« デブサミで最後のPlagger和服講演 | メイン | デブサミ会場リハーサル »

IE6でja.wikipedia.orgが遅い件をHTTPキャプチャしてみる

最速インターフェース研究会 :: 最近IE6でWikipedia日本語版の表示が異常に遅いのはKeepAliveのせい
2月初めぐらいからか、キャッシュが空の状態で日本語版のWikipediaを表示すると、IE6が1分間ほど固まる、という不具合があるそうだ。 で、Proxomitronでレスポンスとか調べてみてたりしたのだけれど、プロキシ経由だと問題なく表示される。

これ、私が普段仕事で使っているIE6でも再現していたので、HTTP Debugging Proxy - Fiddlerを使ってブラウザのHTTP通信をキャプチャして調べてみました。 (※2007/02/13追記:upload.wikimedia.orgで対策され、既に本現象は解消されています)

HTTP Debugging Proxy - Fiddler

どうやら画像ファイルhttp://upload.wikimedia.org/wikipedia/ja/b/bc/Wiki.pngの読み込みで詰まっているようです。

このときのブラウザ(IE6)のリクエストは

GET /wikipedia/ja/b/bc/Wiki.png HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: upload.wikimedia.org
Proxy-Connection: Keep-Alive

そして、サーバからのレスポンスヘッダは以下のようになっていました。

HTTP/1.0 200 OK
Content-Type: image/png
ETag: "7176131403926372302"
Accept-Ranges: bytes
Last-Modified: Tue, 28 Jun 2005 12:26:20 GMT
Content-Length: 11248
Date: Sun, 28 Jan 2007 20:04:27 GMT
Server: lighttpd/1.4.13
X-Cache: HIT from sq15.wikimedia.org
X-Cache-Lookup: HIT from sq15.wikimedia.org:80
X-Cache: HIT from sq5.wikimedia.org
X-Cache-Lookup: HIT from sq5.wikimedia.org:80
X-Cache: HIT from sq2.wikimedia.org
X-Cache-Lookup: HIT from sq2.wikimedia.org:80
X-Cache: HIT from sq6.wikimedia.org
X-Cache-Lookup: HIT from sq6.wikimedia.org:80
X-Cache: HIT from sq1.wikimedia.org
X-Cache-Lookup: HIT from sq1.wikimedia.org:80
X-Cache: HIT from sq14.wikimedia.org
X-Cache-Lookup: HIT from sq14.wikimedia.org:80
X-Cache: HIT from sq5.wikimedia.org
X-Cache-Lookup: HIT from sq5.wikimedia.org:80
X-Cache: HIT from sq9.wikimedia.org
X-Cache-Lookup: HIT from sq9.wikimedia.org:80
X-Cache: HIT from sq5.wikimedia.org
X-Cache-Lookup: HIT from sq5.wikimedia.org:80
X-Cache: HIT from sq15.wikimedia.org
X-Cache-Lookup: HIT from sq15.wikimedia.org:80
X-Cache: HIT from sq1.wikimedia.org
X-Cache-Lookup: HIT from sq1.wikimedia.org:80
X-Cache: HIT from sq2.wikimedia.org
X-Cache-Lookup: HIT from sq2.wikimedia.org:80
X-Cache: HIT from sq7.wikimedia.org
X-Cache-Lookup: HIT from sq7.wikimedia.org:80
X-Cache: HIT from sq12.wikimedia.org
X-Cache-Lookup: HIT from sq12.wikimedia.org:80
X-Cache: HIT from sq1.wikimedia.org
X-Cache-Lookup: HIT from sq1.wikimedia.org:80
X-Cache: HIT from sq5.wikimedia.org
X-Cache-Lookup: HIT from sq5.wikimedia.org:80
X-Cache: HIT from sq2.wikimedia.org
X-Cache-Lookup: HIT from sq2.wikimedia.org:80
X-Cache: HIT from sq15.wikimedia.org
X-Cache-Lookup: HIT from sq15.wikimedia.org:80
X-Cache: HIT from sq9.wikimedia.org
X-Cache-Lookup: HIT from sq9.wikimedia.org:80
X-Cache: HIT from sq7.wikimedia.org
X-Cache-Lookup: HIT from sq7.wikimedia.org:80
X-Cache: HIT from sq1.wikimedia.org
X-Cache-Lookup: HIT from sq1.wikimedia.org:80
X-Cache: HIT from sq5.wikimedia.org
X-Cache-Lookup: HIT from sq5.wikimedia.org:80
X-Cache: HIT from sq8.wikimedia.org
X-Cache-Lookup: HIT from sq8.wikimedia.org:80
X-Cache: HIT from sq4.wikimedia.org
X-Cache-Lookup: HIT from sq4.wikimedia.org:80
X-Cache: HIT from sq2.wikimedia.org
X-Cache-Lookup: HIT from sq2.wikimedia.org:80
X-Cache: HIT from sq4.wikimedia.org
X-Cache-Lookup: HIT from sq4.wikimedia.org:80
X-Cache: HIT from sq12.wikimedia.org
X-Cache-Lookup: HIT from sq12.wikimedia.org:80
X-Cache: HIT from sq9.wikimedia.org
X-Cache-Lookup: HIT from sq9.wikimedia.org:80
X-Cache: HIT from sq1.wikimedia.org
X-Cache-Lookup: HIT from sq1.wikimedia.org:80
X-Cache: HIT from sq12.wikimedia.org
X-Cache-Lookup: HIT from sq12.wikimedia.org:80
Via: 1.0 sq15.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq5.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq2.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq6.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq1.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq14.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq5.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq9.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq5.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq15.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq1.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq2.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq7.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq12.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq1.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq5.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq2.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq15.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq9.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq7.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq1.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq5.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq8.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq4.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq2.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq4.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq12.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq9.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq1.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 sq12.wikimedia.org:80 (squid/2.6.STABLE9)
Connection: close

うげ。Via:だけでの1行1390byte、全体で4KBを越えるレスポンスヘッダが返されている。 しかも、Connection: closeなのにサーバからの接続が維持されたまま。 このままIE6のブラウザがタイムアウトの時間まで(デフォルト:1分間)フリーズしてしまうようです。

試しに、英語版のWikipediaの画像を表示したときと比べてみると

GET /wikipedia/en/b/bc/Wiki.png HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: upload.wikimedia.org
Proxy-Connection: Keep-Alive

サーバからのレスポンスヘッダはこんな感じで少なめ。

HTTP/1.0 200 OK
Content-Type: image/png
ETag: "-2317670875754826488"
Accept-Ranges: bytes
Last-Modified: Sun, 10 Dec 2006 22:24:11 GMT
Content-Length: 26959
Date: Mon, 22 Jan 2007 00:20:36 GMT
Server: lighttpd/1.4.13
X-Cache: HIT from sq1.wikimedia.org
X-Cache-Lookup: HIT from sq1.wikimedia.org:80
X-Cache: HIT from yf1005.yaseo.wikimedia.org
X-Cache-Lookup: HIT from yf1005.yaseo.wikimedia.org:80
X-Cache: HIT from yf1008.yaseo.wikimedia.org
X-Cache-Lookup: HIT from yf1008.yaseo.wikimedia.org:80
X-Cache: HIT from yf1005.yaseo.wikimedia.org
X-Cache-Lookup: HIT from yf1005.yaseo.wikimedia.org:80
X-Cache: HIT from yf1009.yaseo.wikimedia.org
X-Cache-Lookup: HIT from yf1009.yaseo.wikimedia.org:80
X-Cache: HIT from yf1005.yaseo.wikimedia.org
X-Cache-Lookup: HIT from yf1005.yaseo.wikimedia.org:80
X-Cache: HIT from yf1009.yaseo.wikimedia.org
X-Cache-Lookup: HIT from yf1009.yaseo.wikimedia.org:80
Age: 37059
X-Cache: HIT from yf1005.yaseo.wikimedia.org
X-Cache-Lookup: HIT from yf1005.yaseo.wikimedia.org:80
Via: 1.0 sq1.wikimedia.org:80 (squid/2.6.STABLE8), 1.0 yf1005.yaseo.wikimedia.org:80 (squid/2.6.STABLE8), 1.0 yf1008.yaseo.wikimedia.org:80 (squid/2.6.STABLE8), 1.0 yf1005.yaseo.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 yf1009.yaseo.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 yf1005.yaseo.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 yf1009.yaseo.wikimedia.org:80 (squid/2.6.STABLE9), 1.0 yf1005.yaseo.wikimedia.org:80 (squid/2.6.STABLE9)
Connection: keep-alive

しかも、英語版の画像は Connection: keep-aliveのヘッダがきちんと返されています。

日本語版でのみ再現する理由はこの辺なのかもしれません。IE6でCSSを切ると背景画像の読み込みが行なわれないので再現しなくなります。

おそらく、レスポンスヘッダの量がSquidの扱えるバッファサイズ(?)を越えてしまって正しくConnection: keep-aliveを返せずに、接続を維持したままConnection: closeを返しているのが原因なんでしょうか。このときのIE6の挙動については、金床さんが詳しくコメントで記述されています。

Squidのソースコードをダウンロードして詳しい挙動を調べようと思ったんですけど、2.5と2.6でhttpd_accel_* for accelerator modeの設定ファイルの書き方が結構変わっているんですね。これ以上の深追いは面倒なのでやめておきます。

ということで、こんなブラウザ特有の変な事象を解析するときは、ブラウザのHTTP通信をキャプチャするツールを使って、原因を特定するのが楽です。以下にお勧めツールをいくつか紹介しておきます。

ブラウザのHTTP通信キャプチャツール

HTTPヘッダのみキャプチャするタイプ

参考情報
Wikipedia:井戸端#日本語版wikipediaが重い。
207/02/13 0:31 時点で ja.wikipedia.org が重い現象は解消されている模様

コメント

> ※207/02/13追記:upload.wikimedia.orgで対策され、既に本現象は解消されています
207 年!?

> とおる。さん
s/207/2007/;に修正しました。ご指摘ありがとうございますー。