Temporary failure in name resolution - DNS引發的問題和思考
問題描述
由於公司業務需要,將之前部署在阿里雲上的Spring Boot應用遷移到了華為雲的VPC上,之前在阿里雲上應用基本上都是10秒內啟動且看不到任何告警資訊,遷移之後,不僅啟動速度變慢到2到3分鐘
,且時常能在日誌中看到Temporary failure in name resolution
的告警資訊。
以下是當前正在使用的伺服器環境
- 伺服器: 華為雲VPC
- 作業系統:CentOS 7
- JDK版本: 1.8.0_151
- SpringBoot版本: 1.5.8.Rlease
- 容器: Embedded Tomcat 8.5.23
一開始對這個問題,是忽略的,由於本身應用屬於內部開發階段,且每天更新和部署不是那麼頻繁等等因素,一直遲遲沒有想去解決這個問題。不過最近因為臨近專案上線,提交也比較多,而且因為應用拆分和前後端分離的問題,本地除錯比較麻煩,所以開始著手解決這個問題。
問題調查
-
首先看到這個異常,確實第一感覺是域名解析出的問題,於是考慮是不是Tomcat的域名解析服務出的問題,修改了EmbeddedTomcat的配置
修改之後測試發現問題依舊,去官網查了資料
其實Tomcat 8以後預設這個配置就是關閉的,這樣看來自然就不是問題的根源了。 重新梳理了一下思路,Spring Boot的初始化肯定是先於Tomcat的,所以應該是Spring Boot的初始化過程中出現了阻塞導致應用啟動過慢的問題。(
不過要說明的是,知道此時並不確信是因為域名解析導致的阻塞,因為Spring Boot在啟動過程中並沒有丟擲任何異常
)
先做了個測試,啟動Spring Boot應用的同時檢查53埠,此時應用處於假死狀態,應用和遠端的DNS伺服器正在通訊,基本可以斷定是因為呼叫了Jdk的InetAddress類的方法導致的問題。
於是通過jstack定位當前阻塞的程式碼
問題已經顯而易見,Spring Boot在初始化的時候,執行了InetAddress的getLocalHost方法導致程式阻塞而影響了應用的啟動時間。
又檢視了一下當前伺服器的DNS配置
可以看到DNS伺服器的地址是公網的DNS地址,VPC訪問不到導致取主機名的方法發生阻塞,因此導致應用啟動時間非常長
問題解決
跟最初推測的差不多,確實是域名解析的問題,不過意外的是在Spring Boot初始化的時候獲取VMID的時候會獲取當前伺服器的主機名。於是在/etc/resolve.conf中新增了本地主機的解析記錄並刪除無法訪問的公網DNS配置,現在應用的啟動已經和本地一樣了
問題反思
雖然最開始就定位了問題是DNS,不過發生問題的根源一直沒有確定,也不想只是簡單的把DNS配置修改來立刻解決問題,畢竟希望究本溯源,不希望被表面的問題所迷惑。
於是又檢視了JDK的原始碼,發現InetAddress#getLocalHost是個本地方法
本地方法也難不倒我們,下載了openjdk的原始碼找到對應的C原始碼
這個方法來自於jvm.cpp裡面的方法
雖然對C表示不熟,不過基本能看出來是呼叫系統庫的API來獲取的主機名,順便也查詢了一下是說這個系統庫本身設計的就不好,屬於同步呼叫,在網路不通的情況下會導致嚴重的超時問題。
同時不免想對華為雲吐槽幾句,伺服器裝個圖形介面版的CentOS就不說了,起碼給個內網的DNS伺服器啊,完全是沒有經過任何配置優化的作業系統,期待更進一步的改進。
相關文章
- [virtualbox] temporary failure in name resolutionAI
- Resolving archive.cloudera.com... failed: Temporary failure in nameHiveCloudAI
- Temporary failure resolving ‘archive.ubuntu.com‘AIHiveUbuntu
- 由select for update鎖等待問題引發的深入思考
- 一個延時任務問題引發的思考
- 一次線上問題排查所引發的思考
- DNS伺服器故障引發流量異常問題-VeCloudDNS伺服器Cloud
- 關於 http cache 的一個小問題以及引發的思考HTTP
- 【MySQL】ERROR 1878 (HY000): Temporary file write failure.MySqlErrorAI
- 一道題引發的EventLoop思考OOP
- 一道排序題引發的思考排序
- 一道面試題引發的思考面試題
- 記一個面試題引發的思考面試題
- 一個vuepress配置問題,引發的js遞迴演算法思考VueJS遞迴演算法
- Mybatis 一級快取和引發的問題MyBatis快取
- for...in引發的思考
- 由Siri和Alexa結婚引發的思考
- 電梯引發的思考
- 一道賦值面試題引發的思考賦值面試題
- 一道單連結串列題引發的思考
- ViewModel和LiveData問題思考與解答ViewLiveData
- 如何用double hashing解決collision resolution問題
- 定時器引發的思考定時器
- 一個commit引發的思考MIT
- 部門老大的發言引發的思考
- 一道面試題引發的思考:理解 new 運算子面試題
- 由一個emoji引發的思考
- GC(Allocation Failure)引發的一些JVM知識點梳理GCAIJVM
- 首頁白屏的引發的思考(一)
- Authentication failure 以及xxx is not in the sudoers file 問題的解決辦法AI
- 最近思考的一個問題
- 蝦米窮逼 VIP 事件回顧和由此引發的思考事件
- DNS原理及劫持問題DNS
- temporary、interim、tentative和provisional的區別
- DNS解析常見問題:什麼是主DNS伺服器和輔助DNS伺服器?DNS伺服器
- 從跨域引發的Web安全思考?跨域Web
- 佇列順序性引發的思考佇列
- 一次Toast元件引發的思考AST元件
- 一條Python命令引發的漏洞思考Python