最近 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 アドレス
大体こんな流れです
- wget http://www.google.co.jp/ 開始
- PC => ルーター: www.google.co.jp の IPv4 アドレスの問い合わせ
- PC => ルーター: www.google.co.jp の IPv6 アドレスの問い合わせ
- ルーター => PC: www.google.co.jp の IPv4 アドレスの回答
- 5秒間沈黙
- PC => ルーター: 再度 www.google.co.jp の IPv4 アドレスの問い合わせ
- ルーター => PC: www.google.co.jp の IPv4 アドレスの回答
- PC => ルーター: 再度 www.google.co.jp の IPv6 アドレスの問い合わせ
- ルーター => PC: www.google.co.jp の IPv6 アドレスの回答
- www.google.co.jp から HTML ページを取得
ググると、まさに http://www.kunitake.org/chalow/2012-11-02-1.html これのようです。
- PC が IPv4 の問い合わせをした後、ルーターからの回答を受け取る前に IPv6 の問い合わせ
- ルーターは IPv4 と IPv6 両方の問い合わせを受け取るが、IPv4 の回答しかしない
- PC は IPv4 の名前解決はできてるが、なぜか先には進まずルーターからの IPv6 の回答を待つ
- PC は 5秒間待ってタイムアウト
- PC が再度 IPv4 の問い合わせ (今回はルーターからの回答を受け取る前に IPv6 の問い合わせはしない)
- ルーターが IPv4 の回答
- PC が再度 IPv6 の問い合わせ
- ルーターは今回は IPv6 のみの問い合わせなので回答
- やっと 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 件のコメント:
コメントを投稿