公司互聯網域(說白了就是可以連外網的vlan區域的主機)的幾臺主機在ping一個合作方提供的域名時,發現在ping 第一個包時,時間特別長,后面第2--n包開始正常。直接ping 該域名對應的ip 沒這個問題。在使用host -a 、dig、nslookup 、route、nscd -i hosts等輪番上軟分析處理了一通后,問題依舊。
本地nscd 的 DNS cache都清理了還不行,而且本機上又沒有bind DNS服務配置??紤]到ping 里面有一個 -n 參數,即不對域名進行反解析,這里將只ping一個包加-n與不加-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
發現加-n 時real 只用了0.015s,幾乎是立即回包;而不加 -n時,第一個包要使用18.172s 才有回包。
出現該問題的原因是什么呢?
這是因為 ping 的時候遇到 DNS 反向解析問題,默認情況下,當 ping 一個域名的時候,ping 從域名服務商得到域名的 IP 地址,然后 ping 訪問這個 IP 并試圖解析成一個名字,因為我們不提供 DNS 服務也沒有 DNS 反向解析,所以導致 ping 需要等到 DNS time out 才返回,這樣看上去 ping 回應很慢。
ping 是這樣工作的:ping 有兩個線程在執行,一個用來發包,一個用來收包和打印結果,發包的線程不停的發,沒有問題,問題出在收包的線程,這個時候收包線程是被阻塞的(因為這個時候 DNS 反向解析不成功,一直要等到超時),所以收包線程要等到 DNS 超時后才打印出 ping 的結果,而這個時候結果是正確的,因為結果本來就是對的,只不過因為被阻塞而推遲了顯示的時間而已,所以造成 ping 域名間隔很長的假象。如果用ping -n 關閉掉 DNS 解析就不會有這種問題了。
由于本地/etc/resolv.conf 文件里配置的DNS 主機我并有查看權限,所以結合上面的理論,讓業務側去找人分析查看了DNS 的配置是不是有問題。