优化 resolv.conf

DNS lookup 在把域名解析成 IP 过程中耽误了不少时间,尤其是访问比较复杂的网站的时候,比如某个页面包含多个 url,一次请求需要做多次 DNS 解析,并且从用户浏览器到 DNS server,以及 DNS server 和 DNS server 之间都会产生延迟或有可能发生的错误,Google 意识到了这点,作为 Google 雄心勃勃 make the web faster 计划的一部分,Google 去年年底发布了自己的 Google Public DNS,对于一些在我们的 VPS 上使用 vpn 浏览网页的用户,在自己 VPS 里面加入 Google Public DNS 可以加快访问网站的速度(虽然作为用户来说速度差异感觉不明显)。打开 Linux 的 inlcude/resolv.h 文件可以发现里面定义了可以追踪的 DNS server 数目:

$ vi /usr/include/resolv.h

/*
 * Global defines and variables for resolver stub.
 */
# define MAXNS                  3       /* max # name servers we'll track */

所以 /etc/resolv.conf 定义了3个 name server,option rotate 选项指在这3个 dns server 之间轮回查询,option timeout:1 选项设定 lookup timeout 的时间为1秒(默认为5秒),下面是 VPSee 使用的 DNS server 和 resolv.conf 配置:

$ cat /etc/resolv.conf

nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 4.2.2.2
option rotate 
option timeout:1

Ping 域名时 DNS 反向解析问题

中文吃饭的时候看到 Godaddy 事件居然上了 CNN,在美国国会听证会上,GoDaddy 的法律顾问说公司将停止在中国提供新的 .cn 域名注册(据说老的域名还可以继续使用)。不过关系不大,好像中国用户在 Godaddy 注册的 .cn 域名不到3万个。

昨天我们一个用户说他 ping godaddy 域名的时候间隔很长,我理解错了,以为是延迟很长,其实是每次 ping 后间隔时间很长,但是 ping 返回来的 time 值是正常的。这是因为 ping 的时候遇到 DNS 反向解析问题,默认情况下,当 ping 一个域名的时候,ping 从域名服务商得到域名的 IP 地址,然后 ping 访问这个 IP 并试图解析成一个名字,因为我们不提供 DNS 服务也没有 DNS 反向解析,所以导致 ping 需要等到 DNS time out 才返回,这样看上去 ping 回应很慢。

ping 是这样工作的:ping 有两个线程在执行,一个用来发包,一个用来收包和打印结果,发包的线程不停的发,没有问题,问题出在收包的线程,这个时候收包线程是被阻塞的(因为这个时候 DNS 反向解析不成功,一直要等到超时),所以收包线程要等到 DNS 超时后才打印出 ping 的结果,而这个时候结果是正确的,因为结果本来就是对的,只不过因为被阻塞而推迟了显示的时间而已,所以造成 ping 域名间隔很长的假象。如果用 ping -n 关闭掉 DNS 解析就不会有这种问题了,比如:

$ ping -n google.com