2014年7月5日土曜日

Web のブラウンジングで表示が遅い

最近 Ubuntu 14.04 をインストールしたのですが、ブラウザでページを読み込んで表示が完了するまでの時間が長すぎるようで、気になったので調べてみました。

環境
Ubuntu Ja 14.04 Desktop Amd64

まず、遅さ具合を確認します。www.google.co.jp を wget してみると。。。

$ time wget http://www.google.co.jp/
--2014-07-05 18:42:01--  http://www.google.co.jp/
www.google.co.jp (www.google.co.jp) をDNSに問いあわせています... 173.194.38.47, 173.194.38.55, 173.194.38.56, ...
www.google.co.jp (www.google.co.jp)|173.194.38.47|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 特定できません [text/html]
`index.html' に保存中

    [ <=>                                                                                             ] 11,311      --.-K/s   時間 0.002s

2014-07-05 18:42:06 (5.80 MB/s) - `index.html' へ保存終了 [11311]


real    0m5.111s
user    0m0.005s
sys     0m0.007s

「www.google.co.jp (www.google.co.jp) をDNSに問いあわせています...」のところで 5秒程度待たされます。

DNS での名前解決でひっかかっているようなので、tshark でパケットキャプチャしてみました。

こんな感じで tshark でキャプチャしながら別ウィンドウで wget してみました。
$ sudo tshark -i wlan0 udp port 53

  1   0.000000 xx.xx.xx.xx -> yy.yy.yy.yy DNS 76 Standard query 0xef32  A www.google.co.jp
  2   0.000040 xx.xx.xx.xx -> yy.yy.yy.yy DNS 76 Standard query 0x0b78  AAAA www.google.co.jp
  3   0.007425 yy.yy.yy.yy -> xx.xx.xx.xx DNS 286 Standard query response 0xef32  A 173.194.38.47 A 173.194.38.55 A 173.194.38.56 A 173.194.38.63

  ... 5秒間の沈黙 ...

  4   5.004700 xx.xx.xx.xx -> yy.yy.yy.yy DNS 76 Standard query 0xef32  A www.google.co.jp
  5   5.014628 yy.yy.yy.yy -> xx.xx.xx.xx DNS 286 Standard query response 0xef32  A 173.194.38.56 A 173.194.38.63 A 173.194.38.47 A 173.194.38.55
  6   5.014739 xx.xx.xx.xx -> yy.yy.yy.yy DNS 76 Standard query 0x0b78  AAAA www.google.co.jp
  7   5.025026 yy.yy.yy.yy -> xx.xx.xx.xx DNS 250 Standard query response 0x0b78  AAAA 2404:6800:400a:803::1017
  • xx.xx.xx.xx: クライアント PC の IP アドレス
  • yy.yy.yy.yy: ブロードバンドルーターの IP アドレス

大体こんな流れです

  1. wget http://www.google.co.jp/ 開始
  2. PC => ルーター: www.google.co.jp の IPv4 アドレスの問い合わせ
  3. PC => ルーター: www.google.co.jp の IPv6 アドレスの問い合わせ
  4. ルーター => PC: www.google.co.jp の IPv4 アドレスの回答
  5. 5秒間沈黙
  6. PC => ルーター: 再度 www.google.co.jp の IPv4 アドレスの問い合わせ
  7. ルーター => PC: www.google.co.jp の IPv4 アドレスの回答
  8. PC => ルーター: 再度 www.google.co.jp の IPv6 アドレスの問い合わせ
  9. ルーター => PC: www.google.co.jp の IPv6 アドレスの回答
  10. www.google.co.jp から HTML ページを取得

ググると、まさに http://www.kunitake.org/chalow/2012-11-02-1.html これのようです。

  1. PC が IPv4 の問い合わせをした後、ルーターからの回答を受け取る前に IPv6 の問い合わせ
  2. ルーターは IPv4 と IPv6 両方の問い合わせを受け取るが、IPv4 の回答しかしない
  3. PC は IPv4 の名前解決はできてるが、なぜか先には進まずルーターからの IPv6 の回答を待つ
  4. PC は 5秒間待ってタイムアウト
  5. PC が再度 IPv4 の問い合わせ (今回はルーターからの回答を受け取る前に IPv6 の問い合わせはしない)
  6. ルーターが IPv4 の回答
  7. PC が再度 IPv6 の問い合わせ
  8. ルーターは今回は IPv6 のみの問い合わせなので回答
  9. やっと www.google.co.jp から HTML ページを取得

man を見てみると

$ man resolv.conf
... snip ...
single-request (since glibc 2.10)
       sets RES_SNGLKUP in _res.options.  By default, glibc performs IPv4 and IPv6 lookups  in  parallel  since  version
       2.9.   Some  appliance  DNS  servers  cannot  handle these queries properly and make the requests time out.  This
       option disables the behavior and makes glibc perform the IPv6 and IPv4 requests sequentially (at the cost of some
       slowdown of the resolving process).
... snip ...

glibc の Version 2.9 以降は IPv4 と IPv6 の問い合わせを同時に実行するようになったようです。

この同時問い合わせを適切に扱うことができない DNS 機器があるようですが、私が使っているブロードバンドルーターがまさにこれに該当するようです。

glibc Version 2.10 以降では single-request オプションを付けると IPv6 と IPv4 を同時にではなく順次に実行するようにできるようです。

ubuntu では glibc は libc6 パッケージで良いようです。バージョンを確認すると

$ dpkg --list libc6
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前                         バージョン          アーキテクチャ      説明
+++-============================-===================-===================-==============================================================
ii  libc6:amd64                  2.19-0ubuntu6       amd64               Embedded GNU C Library: Shared libraries

Version 2.19 なので single-request オプション使えます。

/etc/resolv.conf に single-request を書きたいのですが、

$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1

というように書いてあり、直接このファイルを編集できません。man で調べると

$ man resolvconf
... snip ...
/etc/resolvconf/resolv.conf.d/tail
       File to be appended to the dynamically generated resolver configuration file.  To append nothing,  make  this  an  empty
       file.  This file is a good place to put a resolver options line if one is needed, e.g.,

           options inet6
... snip ...

このファイルに書くと良いようです。このファイルはデフォルトでは設置されていないので以下の内容で新規に作成します。

$ cat /etc/resolvconf/resolv.conf.d/tail
options single-request

PC を再起動するとちゃんと反映されました。

$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
options single-request

DNS 問い合わせをパケットキャプチャしてみると

1   0.000000 xx.xx.xx.xx -> yy.yy.yy.yy DNS 76 Standard query 0x030c  A www.google.co.jp
2   0.006694 yy.yy.yy.yy -> xx.xx.xx.xx DNS 286 Standard query response 0x030c  A 173.194.38.56 A 173.194.38.63 A 173.194.38.47 A 173.194.38.55
3   0.006861 xx.xx.xx.xx -> yy.yy.yy.yy DNS 76 Standard query 0xe494  AAAA www.google.co.jp
4   0.014786 yy.yy.yy.yy -> xx.xx.xx.xx DNS 250 Standard query response 0xe494  AAAA 2404:6800:400a:803::1017

IPv4 の名前解決が完了したあとに IPv6 の名前解決をやってます。

wget もすぐに完了します。

$ time wget http://www.google.co.jp/
--2014-07-05 21:29:40--  http://www.google.co.jp/
www.google.co.jp (www.google.co.jp) をDNSに問いあわせています... 173.194.38.55, 173.194.38.56, 173.194.38.63, ...
www.google.co.jp (www.google.co.jp)|173.194.38.55|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 特定できません [text/html]
`index.html.1' に保存中

        [ <=>                                                                                             ] 11,273      --.-K/s   時間 0s

2014-07-05 21:29:40 (59.7 MB/s) - `index.html.1' へ保存終了 [11273]


real    0m0.114s
user    0m0.004s
sys     0m0.006s

Web のブラウジングでも待たされることがなくなりました。


0 件のコメント:

コメントを投稿