檢瓜子網(wǎng)絡(luò)性能優(yōu)化紀(jì)實(shí)
一天揖、背景
????????檢瓜子是瓜子二手車為二手車評估師開發(fā)的智能車輛評估檢測工具App褂始。在兩年的開發(fā)維護(hù)中诸典,有一個(gè)問題一直困擾著一線評估師:做一些操作時(shí)偶爾會出現(xiàn)“網(wǎng)絡(luò)異常,請重試”的提示崎苗,影響評估師的檢測效率狐粱,用戶體驗(yàn)不友好。為此胆数,技術(shù)團(tuán)隊(duì)針對這個(gè)問題開始做了一系列的動(dòng)作以提高網(wǎng)絡(luò)請求的成功率肌蜻,提升用戶體驗(yàn)。
二必尼、網(wǎng)絡(luò)性能原狀
????????優(yōu)化一個(gè)問題蒋搜,首先要清楚這個(gè)問題目前影響范圍,影響程度是怎樣的判莉,這樣在做優(yōu)化的時(shí)候才能做出前后的對比豆挽,以數(shù)據(jù)展現(xiàn)優(yōu)化動(dòng)作的效果,并逐步提高券盅。為此我們對App內(nèi)所有的網(wǎng)絡(luò)請求進(jìn)行了監(jiān)控祷杈。以2017-11-1日數(shù)據(jù)為例:
? ? ** 網(wǎng)絡(luò)請求成功數(shù)量:1087028
? ? ** 網(wǎng)絡(luò)請求失敗數(shù)量:7291
? ? ** 網(wǎng)絡(luò)失敗率:0.67%
? ? ? ? 除了我們自己APP的監(jiān)控,我們同時(shí)接入了第三方網(wǎng)絡(luò)監(jiān)控平臺“聽云”渗饮,十月中旬的檢測數(shù)據(jù)如下圖,圖中“j******i.guazi.com”是檢瓜子的網(wǎng)絡(luò)請求域名宿刮,不難發(fā)現(xiàn)我們后端服務(wù)的網(wǎng)絡(luò)性能確實(shí)和一些優(yōu)秀的后端服務(wù)“up.qiniu.com”之間有明顯差距互站。
三、網(wǎng)絡(luò)錯(cuò)誤原因分析
????????我們對2017-11-1所有的網(wǎng)絡(luò)錯(cuò)誤根據(jù)異常的原因做了聚合僵缺,然后分別對每個(gè)原因進(jìn)行錯(cuò)誤占比的統(tǒng)計(jì)胡桃。主要分為DNS解析異常和Socket超時(shí)異常。明細(xì)數(shù)據(jù)如下圖:
四磕潮、DNS異常解決方案
? ? ? ? 為了解決DNS異常的問題翠胰,我們嘗試了 http dns (利用一個(gè) HTTP 的查詢目標(biāo)域名IP的 服務(wù)替代默認(rèn)的 dns解析過程)容贝。我們進(jìn)行了三天的灰度對比,樣本比例為4:6(40%未采用http dns之景,60% 采用了 http dns)斤富。收集了灰度數(shù)據(jù)如下圖:
? ? ? ? 分析圖中數(shù)據(jù)可得出幾個(gè)結(jié)論:
? ? ? ? ** 采用了 Http dns 之后我們的網(wǎng)絡(luò)錯(cuò)誤率降低了 20 % 以上。
? ? ? ? ** dns 錯(cuò)誤占所有錯(cuò)誤的比例大幅降低锻狗。
? ? ? ? ** dns 錯(cuò)誤占比降低幅度大于網(wǎng)絡(luò)錯(cuò)誤占比降低幅度:一部分dns錯(cuò)誤轉(zhuǎn)移為了Socket超時(shí)錯(cuò)誤满力。
五、Socket超時(shí)解決方案
? ? ? ? Http 通信在連接建立了以后轻纪,開始進(jìn)入 Socket 通信階段油额,這個(gè)階段包含三個(gè)主要時(shí)間段:
? ? ? ? ** 客戶端通過網(wǎng)絡(luò)發(fā)送request數(shù)據(jù)報(bào)文到server
? ? ? ? ** server處理request并生成response (服務(wù)端接口性能、延時(shí))
????????** 服務(wù)端通過網(wǎng)絡(luò)將response發(fā)送回客戶端
1刻帚、網(wǎng)絡(luò)原因
? ? ? ? 為了及時(shí)發(fā)現(xiàn)和解決網(wǎng)絡(luò)延時(shí)導(dǎo)致的 socket timeout 我們接入了第三方聽云的 ping 檢測服務(wù)潦嘶。它利用分布在全國的不同城市不同運(yùn)營商(移動(dòng)、聯(lián)通崇众、電信)的終端節(jié)點(diǎn)定時(shí) ping 目標(biāo)域名或者IP,查看ping的丟包率以及延時(shí)信息掂僵。這些節(jié)點(diǎn)的類型為 last mile 節(jié)點(diǎn),和我們的目標(biāo)用戶節(jié)點(diǎn)類型一致校摩。 如果某些節(jié)點(diǎn)有問題能夠及時(shí)報(bào)警看峻,以便推動(dòng)運(yùn)維人員幫助我們解決網(wǎng)絡(luò)問題。
? ?
2衙吩、服務(wù)器接口響應(yīng)時(shí)間
? ? ? ? 導(dǎo)致socket timeout 的另一個(gè)主要原因是因?yàn)榉?wù)端的接口響應(yīng)時(shí)間過長互妓,偶爾會出現(xiàn)接口延時(shí)超過 20S 的嚴(yán)重問題。為了能夠及時(shí)的推送服務(wù)端優(yōu)化接口性能坤塞,我們也對每個(gè)接口的延時(shí)進(jìn)行了監(jiān)控冯勉。每周發(fā)出一個(gè)接口響應(yīng)時(shí)間最長 top 10 的榜單。以便服務(wù)端有針對性的解決某個(gè)接口延時(shí)的問題摹芙。經(jīng)過幾周的共同努力我們的接口平均響應(yīng)時(shí)間從523ms降低到了357ms灼狰。
????下圖是一個(gè)接口優(yōu)化后接口延時(shí)的前后對比,延時(shí)曲線有了明顯的變化浮禾。
? ?????此方法在與服務(wù)端交胚、運(yùn)維人員討論后,我們在公司范圍內(nèi)對所有業(yè)務(wù)線的所有接口進(jìn)行了統(tǒng)一的監(jiān)控盈电,更好的幫助研發(fā)人員發(fā)現(xiàn)問題并及時(shí)解決蝴簇。