Gmailが重い?+DNSキャッシュ削除@Windows

最近Gmailが重い(反応が遅かったり、「しばらくお待ちください...」になる)ことが時々ある。
ただし、PCやChromeを起動しっぱで使っているのだけれども・w・;
残念ながら新しいタブで別のGmailを開けても解決はしない。
しかも、重いときに隣のPC(PPPoEで別IPアドレスが振られている)からやってみると、ぜんぜん軽かったりする。
残る原因といえば、DNSキャッシュである。


この間学校でGoogleインターンの説明とともに行われた技術公演における、Googleのデータセンタの説明によると、Gmailもおそらく地理的に分散されたデータセンタで、負荷分散・フェイルオーバーを行いながら運用されているようだ。
nslookup gmail.comでIPを何回か引いてみると、最初の8ビット(はじめのドットまで)が異なるようなアドレスが返されてくる。地理的に離れた位置のデータセンタに負荷分散しているようだ。
さらに、複数のAレコードを持っているし、同じIPが帰ってくるときでも順番が変わっている。
以上より、DNSラウンドロビンを地理的に離れた場所に対して行っていることがわかる。


DNSラウンドロビンとはつまり、あるドメインに対するAレコードを、
1.1.1.1、1.1.1.2と複数持たせておき、さらに、ドメイン名->IPの正引きのときに、1.1.1.1、1.1.1.2の順番と1.1.1.2、1.1.1.1の順番で返すことで、負荷を分散しつつ、障害に(完全とはいえないが)耐性を持たせるものである。(多くのブラウザが、1つ目のIPにアクセスしてみて、だめだったら2つめにアクセスする、とぴうような動作をすることを利用している。)


さて本題だが、今回反応が遅くなったのは、もしかすると、サービスを提供するホストが切り替わった場合だ。
例えば、1.1.1.1と1.1.1.2のIPアドレスで、DNSラウンドロビンが運用されていて、Chromeがmail.google.comのIPアドレスを取得しにいったときのリプライが、1.1.1.1、1.1.1.2の順だったとしよう。ここで、1.1.1.1のホストがダウンし、1.1.1.2にフェイルオーバーされた場合を考えよう。長期にPCを起動しているなら、利用中にそのようなフェイルオーバーが起こることもありうるだろう。このとき、Chromeがアクセスするのは、もちろんキャッシュでされた一つ目のIPアドレス、1.1.1.1である。1.1.1.2へのフェイルオーバーが起こったことを通知するすべはない。よって、アクセスした先の1.1.1.1はダウンしており、TCPタイムアウトが発生するまで待たされ(この間は固まる)、その後1.1.1.2にアクセスすることで、ようやくメールが開けた。
このように、障害発生時にしばらくはダウンしたサーバに一度アクセスし、次に正常なサーバにアクセスするという現象が起こるのが、DNSラウンドロビンが障害対策にならないというような議論が起こる理由のひとつであろう。

しかしここで重要なことを見落としていたことを思い出す。それはDNSレコードのTTLである。
mail.google.comはgooglemail.l.google.com.へのCNAMEレコードを持っている。このgooglemail.l...のAレコードのTTLは、実は44秒しかなかったのだ!

ということは、DNSキャッシュが長期に残るはずはなく、つまり、障害が発生してから最長44秒後には、ダウンしたサーバに待たされることなくアクセスできるはずである。よって、フェイルオーバーとDNSラウンドロビンの組み合わせが原因ではない。


結局原因はわからずじまいであった。もしかしたら、DNSラウンドロビンの欠点である、「DNS側で障害検知を行わなくてはならない」「発見できない障害(ある経路からはアクセスできなくなった等)に耐性がない」という問題が露呈したのかもしれない。Googleの技術を持ってすればそんなことはないような気がするのだが・・・。それとも、上流のロードバランサかルータか何かに問題が発生しているのだろうか。


さて、最後に、この原因を追究する間に、WindowsDNSキャッシュをクリアする方法を探したので、メモとして残しておく。

Linuxなどでいうところの、nscd -i hostsは、Windowsでは、ipconfig /flushdnsだと。まさかipconfigだとは・・・。なお、/displaydnsで現在のキャッシュ(一部だけ??)も表示することができるようです。

http://crazy-man.cocolog-nifty.com/blog/2009/10/dnswindows-7-rc.html

このページにやり方が載っていて、はじめてコマンドプロンプトからDNSキャッシュを消す方法を知りました。書いてくれていたブログの作者に感謝!
ちなみに他には、「ネットワーク接続」の中でアダプタを右クリックして「修復」を押すと、DNSキャッシュの消去も一緒に行われるらしい。


またひとつ勉強になった。


あ、近況ですが、超交流会に参加したことと、OSC Kyotoに参加することと、まぁとりあえずはそんな感じです・w・!


以上、やや適当な追求でした・w・ノ