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伺服器啊,完全是沒有經過任何配置優化的作業系統,期待更進一步的改進。
相關文章
- name server cannot be used, reason: Temporary failure in name resolutionServerAI
- IP address could not be resolved: Temporary failure in name resolutionAI
- MySQL could not be resolved: Temporary failure in name resolution報錯解決方法MySqlAI
- Resolving failed: Temporary failure in name resolution 錯誤解決方法AI
- Resolving archive.cloudera.com... failed: Temporary failure in nameHiveCloudAI
- Object Name Resolution (248)Object
- IP地址修改後,DNS解析引發的問題DNS
- Solution for Deepin DNS resolution errorDNSError
- 一個延時任務問題引發的思考
- 一次線上問題排查所引發的思考
- 由select for update鎖等待問題引發的深入思考
- DNS伺服器故障引發流量異常問題-VeCloudDNS伺服器Cloud
- reflow和repaint引發的效能問題AI
- 摩拜單車紅包騎行引發的潮汐問題思考
- 關於 http cache 的一個小問題以及引發的思考HTTP
- 一道題引發的EventLoop思考OOP
- 記一個面試題引發的思考面試題
- 一道排序題引發的思考排序
- 一道面試題引發的思考面試題
- Temporary failure resolving ‘archive.ubuntu.com‘AIHiveUbuntu
- 由京東發貨引發的思考和分析
- 一道 JS 面試題引發的思考JS面試題
- 一道面試題目引發的思考面試題
- for...in引發的思考
- 一個vuepress配置問題,引發的js遞迴演算法思考VueJS遞迴演算法
- Mybatis 一級快取和引發的問題MyBatis快取
- 由Siri和Alexa結婚引發的思考
- 一道賦值面試題引發的思考賦值面試題
- ssd上一道題目引發的思考
- 一道數學題引發的思考薦
- 一道簡單的題目引發的思考
- 電梯引發的思考
- order by limit 引發的思考MIT
- 一道單連結串列題引發的思考
- 【MySQL】ERROR 1878 (HY000): Temporary file write failure.MySqlErrorAI
- 問題思考
- 定時器引發的思考定時器
- 由吃飯引發的思考