一個DNS請求引起的網絡阻塞

前段時間遇到Linux應用程序網絡丟包問題,應用程序接收網絡報文數據丟失界面展示信息不全.以下是對該問題進行基本的簡要分析與定位的過程。

 

在網絡轉發路徑未發現網絡傳輸丟包情況.通過Linux netstat查看gmond應用程序socket狀態發現一個奇怪的現象,gmond Recv-Q網絡報文數量持續不斷增長,且多次查看狀態均未出現清零的情況,初步懷疑內核socket接收存在丟包即CPU處理性能瓶頸導致應用程序無法及時接收網絡報文。

 

netstat -lnup輸出:



htop查看系統應用進程CPU佔用率並未發現CPU滿負荷運行情況直接排除CPU處理性能瓶頸導致應用程序無法及時接收網絡報文。問題轉向了gmond應用程序,如何跟蹤應用程序系統調用.那就是strace!

 strace命令是一個集診斷、調試、統計與一體的工具,我們可以使用strace對應用的系統調用和信號傳遞的跟蹤結果來對應用進行分析,以達到解決問題或者是瞭解應用程序工作過程的目的。strace使用方法請參考網上資源.

 

strace -p 2747 輸出,發現gmond應用程序間歇性的執行系統調用如下:



gmond應用程序在進行DNS請求解析,在Linux下常用gethostbyname函數用於域名解析,其內部會對配置DNS服務器進行遍歷遞歸查詢直到域名解析請求成功或域名解析請求超時,同時該接口無法設置timeout超時間直接影響應用程序執行效率。

 

gmond應用程序在進行DNS請求解析,但請求無響應導致間歇性的阻塞等待請求超時,直接導致gmond應用程序接收網絡報文異常,解決辦法:

1)DNS服務器配置正確網絡可達,並設置缺省域名解析即對無法解析域名及時迴應DNS解析異常,避免遍歷遞歸查詢DNS。

2)在多線程環境避免使用gethostbyname進行域名解析,採用gethostbyname_r網上建議以避免多線程環境採用gethostbyname發生阻塞。

3)對高DNS解析應用程序直接配置本地host直接本地解析提高DNS解析效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章