公司互聯(lián)網(wǎng)域(說白了就是可以連外網(wǎng)的vlan區(qū)域的主機)的幾臺主機在ping一個合作方提供的域名時,發(fā)現(xiàn)在ping 第一個包時,時間特別長,后面第2--n包開始正常。直接ping 該域名對應(yīng)的ip 沒這個問題。在使用host -a 、dig、nslookup 、route、nscd -i hosts等輪番上軟分析處理了一通后,問題依舊。
本地nscd 的 DNS cache都清理了還不行,而且本機上又沒有bind DNS服務(wù)配置。考慮到ping 里面有一個 -n 參數(shù),即不對域名進(jìn)行反解析,這里將只ping一個包加-n與不加-n的結(jié)果進(jìn)行了比對,具體如下:
www.361way.com:~ # time ping -n spay2.shuqiapi.com -c 1 PING sqsdou.wx.ucweb.com (211.103.25.41) 56(84) bytes of data. 64 bytes from 211.103.25.41: icmp_seq=1 ttl=50 time=10.7 ms --- sqsdou.wx.ucweb.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 10.705/10.705/10.705/0.000 ms real 0m0.015s user 0m0.000s sys 0m0.000s www.361way.com:~ # time ping spay2.shuqiapi.com -c 1 PING sqsdou.wx.ucweb.com (211.103.25.41) 56(84) bytes of data. 64 bytes from 211.103.25.41: icmp_seq=1 ttl=50 time=10.6 ms --- sqsdou.wx.ucweb.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 10.640/10.640/10.640/0.000 ms real 0m18.172s user 0m0.000s sys 0m0.000s
發(fā)現(xiàn)加-n 時real 只用了0.015s,幾乎是立即回包;而不加 -n時,第一個包要使用18.172s 才有回包。
出現(xiàn)該問題的原因是什么呢?
這是因為 ping 的時候遇到 DNS 反向解析問題,默認(rèn)情況下,當(dāng) ping 一個域名的時候,ping 從域名服務(wù)商得到域名的 IP 地址,然后 ping 訪問這個 IP 并試圖解析成一個名字,因為我們不提供 DNS 服務(wù)也沒有 DNS 反向解析,所以導(dǎo)致 ping 需要等到 DNS time out 才返回,這樣看上去 ping 回應(yīng)很慢。
ping 是這樣工作的:ping 有兩個線程在執(zhí)行,一個用來發(fā)包,一個用來收包和打印結(jié)果,發(fā)包的線程不停的發(fā),沒有問題,問題出在收包的線程,這個時候收包線程是被阻塞的(因為這個時候 DNS 反向解析不成功,一直要等到超時),所以收包線程要等到 DNS 超時后才打印出 ping 的結(jié)果,而這個時候結(jié)果是正確的,因為結(jié)果本來就是對的,只不過因為被阻塞而推遲了顯示的時間而已,所以造成 ping 域名間隔很長的假象。如果用ping -n 關(guān)閉掉 DNS 解析就不會有這種問題了。
由于本地/etc/resolv.conf 文件里配置的DNS 主機我并有查看權(quán)限,所以結(jié)合上面的理論,讓業(yè)務(wù)側(cè)去找人分析查看了DNS 的配置是不是有問題。