resolv.conf 的超時(timeout)與重試(attempts)機制


/etc/resolv.conf 有兩個默認的值至關重要,一個是超時的 timeout,一個是重試的 attempts,默認情況下,前者是 5s 后者是 2 次。
這個估計很多工程師都不是很在意,一般情況下,使用默認的值倒沒什么大問題,特殊情況我會在最后說明。

要測試,不要使用 dig, host, nslook 這類工具,因為他們並沒有調用 resolver 的庫,可以使用 getent 來測試。上面提到的只是一些診斷的工具,對於日常的應用來說,包括 web server、mail client、db 以及各種 app server 等等,任何使用 glibc resolver 都需要經過 resolv.conf 文件。

對於 libresolv 來說,只認 resolv.conf 的前三個 nameserver,所以寫的再多也沒什么意義。正常情況下,resolver 會從上至下進行解析,每個 nameserver 等待 timeout 的時間,如果一直到第三個都沒結果,resolver 會重復上面的步驟 (attempts – 1) 次。

為了真正理解,例如下面這個場景:
search test.example.com example.com  
nameserver 192.168.0.1  
nameserver 192.168.0.2

假設 192.168.0.1 不返回結果(可能根本就不是台 DNS),我們假設需要解析 "www.devel",而這個僅僅在 www.devel.example.com 里面有記錄,下面是整個執行的步驟:
1. "www.devel" on 192.168.0.1, wait until timeout (default 5 secs)
2. "www.devel" on 192.168.0.2, get reply: no such hostname
3. "www.devel" on 192.168.0.1, wait until timeout (default 5 secs)
4. "www.devel" on 192.168.0.2, get reply: no such hostname
5. "www.devel.test.example.com" on 192.168.0.1, wait until timeout (default 5 secs)
6. "www.devel.test.example.com" on 192.168.0.2, reply no such hostname
7. "www.devel.test.example.com" on 192.168.0.1, wait until timeout (default 5 secs)
8. "www.devel.test.example.com" on 192.168.0.2, reply no such hostname
9. "www.devel.example.com" on 192.168.0.1, wait until timeout (default 5 secs)
10. "www.devel.example.com" on 192.168.0.2, reply with IP address

默認情況下是 5s 超時,我做了兩個簡單的測試,把 resolv.conf 的前三個 nameserver 全部換成不存在的 1.1.1.1, 2.2.2.2, 3.3.3.3,然后可以觀察下面 strace 跟蹤的結果,對於 ping 以及 getent 來說,已經算是上層的應用結果了。
1. strace -t getent hosts baidu.com 
2. strace ping baidu.com

把 timeout 設置為 1s 的結果可以看下面這個測試結果:
strace -t ping baidu.com(options timeout:1)

對於生產有什么意義了?
對於任何的代碼,不管何種形式的(HTTP 的也好,DB 的連接也罷),只要是一端對另外一端的連接,都應該加上超時重試以及異常處理的。上面其實一共涉及三個點:
1. 超時,目前絕大多數的 API 都支持這類參數,包括我們線上用的 grequestsMySQLdb等等
2. 重試,對於代碼層面同樣重要,跟上面類似
3. 異常處理,好的代碼對於無法連接或者連接超時等問題應該及時的拋出異常打 log,而不是什么都沒有,否則會加大問題定位的工作量,后期維護起來也會異常的麻煩。

這里有個有意思的腳本能檢測最佳的 DNS。

最后,記得 dig, nslook 只會解析 resolv.conf 的內容,而不會解析 hosts 里面內容,所以如果想讓 dig 解析 hosts 里面的內容,可以通過 dnsmasq 實現。

ref:
https://access.redhat.com/solutions/21420
http://serverfault.com/questions/562079/adjusting-how-long-linux-takes-to-fail-over-to-backup-dns-server-listed-in-resol

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM