有種速度讓你望塵莫及 | 手機QQ及Qzone速度優化實踐new
導語
移動互聯網發展那么快,運維技術也要適應業務的變化啊,這次小編找了騰訊牛人介紹的手機QQ和手機Qzone的速度優化實踐。
我們堅信不同垂直領域的運維分工會越來越不同,如何能在不同的業務形態上,利用運維技術和數據為業務帶來更大的價值,將是我們下一步探索的重點方向。
1. 關于用戶等待時間
對用戶來說,最直觀的感受就是APP的等待時間,所以我們首先要分析清楚APP到底在哪里讓用戶等待,耗時在哪里。
等待時間無非就以下三個:
· Server處理耗時
· 網絡傳輸耗時
· 客戶端數據處理/UI渲染耗時
QQ/Qzone等產品由于已經有多年的Server端優化,大部分數據都是直接讀寫nosql數據庫,接口耗時基本都在30-120ms,優化Server實際的收益并不會很大。
下面主要介紹后兩個方向上的優化實踐。
2. 網絡傳輸
首先我們需要統計數據在網絡傳輸的耗時情況,才能知道優化網絡傳輸有多少價值
2.1 網絡傳輸耗時統計
網絡耗時通過TCP協議的三次握手在服務端進行統計,優點是簡單快速低成本,具體方案如下:
- 記錄下第一次握手時服務端收到SYNC包的時間Time1
- 記錄下第三次握手時服務端收到的ACK包時間Time2
- 兩個時間之差即是網絡往返耗時RT(Time2-Time1)(見圖2.1)
圖2.1 從服務端測網絡延時
通過實際數據統計,在不跨網訪問的情況下(信號正常):
· 4G耗時約30-100ms
· 3G耗時約 200-400ms
從速度結果上看,目前主流的3G/4G網速還是相當不錯的,但是由于移動網絡的復雜性,從QQ和空間的業務返回碼監控上還是發現有不少問題:
· 跨網訪問
· 跨地區訪問
· 某些小運營商劫持等
下面分享下手機Qzone在接入組件的優化策略
2.2 手機Qzone WNS接入策略
簡介:WNS,手機QQ空間APP到服務端通信框架,支持tcp、http協議
2.2.1使用私有協議直接IP長連接訪問(圖2.2)
優點:
· 減少DNS請求耗時
· 避免DNS域名劫持
· 單個連接并發多個數據請求減少連接數的開銷(相對http)
· 私服協議加密安全;
缺點:由于不走域名,首次連接需要額外的策略來找到合適的接入點,并且需要有重定向能力
圖2.2 私有協議直接IP長連接
2.2.2 首次連接策略
世界上最遙遠的距離就是你在聯通,而我在電信。在復雜的移動網絡環境下,我們需要優化網絡的接入策略避免跨網/跨地區訪問。
使用移動網絡時我們先識別用戶的運營商,同時起4個連接,多個接入IP+多個端口+2種協議,再同時使用2種協議和多個端口是為了避免有些本地運營商的限制,使用第一個連接上的連接(見圖2.3)
圖2.3 首次并發嘗試連接
使用WIFI的用戶首次連接會優先使用域名嘗試連接。
當上面策略都連不上時客戶端會運行打分策略,使用備份IP列表連上一個速度最快的接入。
騰訊擁有國內大量的CDN節點,即使是偏遠地區也可以通過CDN節點接入做為代理!
優點:多種首次連接策略能有效的保證用戶最大可能的先連上服務器,這在復雜的移動網絡中特別重要!
缺點:首次連接有額外開銷;連接上不一定是最優的接入點;使用CDN節點做為代理接入成本較高
2.2.3 最優接入&重定向
連接上之后服務端通過GSLB IP庫識別用戶的出口IP,如果發現用戶的接入不是最優的接入,通過大數據分析該用戶在某個時段最應該使用的接入點,會下發重定向指令,讓客戶端連接到最優的服務端接入IP,WIFI下還會緩存住SSID和接入IP。
優點:讓用戶能就近/最優接入,減少網絡的耗時
缺點:少部分用戶首次使用需要連接2次服務器;
2.2.4 使用字典做數據壓縮
減少帶寬開銷;安全
2.2.5 心跳
避免長連接斷開
2.2.6 單連接并發請求
相對多連接單請求的傳統HTTP模式(HTTP 2.0之前),用單連接可以大大減少客戶端和服務端開銷
結論
移動網絡上我們能做的優化無非就是減少連接,減少請求,避免跨網跨區,優化協議。而隨著4G/光纖的快速發展,以后越來越多用戶在網絡上的耗時會越來越少,意味著我們網絡策略上的優化效果收益也會越來越低,這時我們把目光投向終端。
3. 終端耗時
同上,首先需要確認終端的耗時情況以確認優化預期和目標。
通過在客戶端埋點的上報監控,發現手機Qzone某個灰度版本用戶一些操作之后3秒以上沒響應比率最高達30%;手機QQ某個灰度版本由于UI問題導致畫面掉幀比率約15%,在投訴的問題分類中,卡、慢、卡頓投訴量長期居前三甲。
可以得出這樣的結論:終端的問題很嚴重,而且跟用戶操作體驗直接相關!
3.1 Android/IOS系統背景
既然是想優化移動客戶端,那對于操作系統(Android和IOS)需要有個基本的了解,兩者都是基于UNIX/LINUX開發的系統,對于運維人員來說很多概念都很好理解。
其中比較重要的一條設計理念是:Android和IOS都能進行多線程開發,其中有一個是主線程也稱UI線程,UI線程是唯一有權限操作用戶UI的線程,如果用戶在操作有體驗上的問題,那肯定是因為主線程被堵塞或沒有足夠的運行資源。所以從主線程的監控和系統資源的占用入手。
3.2 監控的策略
怎么判斷終端出現卡慢等性能問題呢?通過上面對andoid和ios的背景介紹,我們的目標放在主線程的監控上,這邊主要有2種監控策略:
- 監控函數間調用耗時
當主線程調用函數調用超過N秒時,主線程處于等待堵塞狀態,用戶所有UI行為暫停,所以認為終端出現卡的情況。缺點:無法準確反應用戶的體驗
優點:實現成本低,開銷低
- 監控屏幕FPS,監控掉幀數
當用戶操作時發生頁面掉幀時,認為用戶發生卡慢或卡頓(如圖3-1)優點:真實反應用戶的體驗,而且能對卡慢卡頓的體驗分級,如分為短卡、長卡
缺點:有額外的FPS監控開銷,經過測試該開銷大概占整個APP開銷的2%
如圖3-1監控屏幕FPS的次數
3.3 堆棧的采集
監控的策略有,接下來應該考慮怎樣配合監控策略,把“案發現場”的數據獲取出來并上報至服務端。
“案發現場”數據除了系統資源,如CPU、內存等,最重要的一定是代碼的執行堆棧數據。由于移動終端性能資源有限,在采集堆棧數據的時候要非常注意對系統的影響,所以需要定好觸發采集堆棧的時機,這邊主要也有2種采集方案:
3.3.1 開啟額外的線程記錄主線程堆棧
額外啟動一個子線程,子線程記錄著主線程的堆棧數據,當發生卡頓的時候從該線程獲取到堆棧數據,優點是只需要引入一個很小的SDK包,而且無視版本的編譯方法和虛擬機。獲取堆棧的策略也分為 消極策略和積極策略
-
消極策略:
認為卡慢卡頓的問題在短時間內只會發生一次,如果錯過了將無法獲取到真實的現場堆棧。
該策略的做法是:子線程時刻獲取著主線程的堆棧,當主線程發生問題時,通過發生問題的開始時間戳和結束時間戳,在子線程獲取到案發時的堆棧數據(如圖3-2)
缺點:需要子線程時刻記錄主線程堆棧,開銷大
優點:獲取到的堆棧數據準確
圖3-1監控主線程函數調用耗時
-
積極策略:
認為卡慢卡頓的問題在短時間內會發生幾次或持續發生一段時間。
該策略的做法是:當主線程發生問題時,激活子線程獲取堆棧,在接下來的N秒內在子線程獲取X個堆棧
缺點:堆棧有隨機性,獲取到的堆棧是案發后的堆棧
優點:額外開銷極少,對APP基本沒影響
3.3.2 在編譯階段打樁/嵌入埋點
通過在編譯階段使用工具在每個函數調用點加入耗時統計函數
缺點:增加APP包大小,經過測試約增加APP10~20%的包大小,而且不同編譯方法和虛擬機需要不同的工具支持打樁嵌入;缺少系統調用數據
優點:無需運行時的額外線程額外開銷
2種方案都各有優點各有可取之處,但由于產品對包大小有嚴格限制,目前在QQ和Qzone主要采用方案1
3.4 大數據聚類分析
前面提到,方案1的消極策略對終端性能影響較大,但是積極策略獲取到的數據有隨機性,即客戶端無法精確的捕獲到問題堆棧。
而目前我們主要采用積極策略+大數據聚類分析的方法來分析問題。這一方案的基本思想是如果一段邏輯代碼真的有性能問題,那大多數用戶都發生。
所以我們采用對堆棧數據做聚類分析的方法,將能形成數據規模的堆棧找出來,過濾掉偶爾由于隨機性獲取到的無關堆棧。
對堆棧的聚類統計上,我們主要通過構建CT(ClimbingTree)來解決。
ClimbingTree是內部叫法,主要思路是通過堆棧生成堆棧樹,并利用海量數據加權計算(主要是函數耗時)到樹上,最后根據權重將同層節點運行從左到右進行排序,并將設定閾值以下的節點運行剪枝。
ClimbingTree的特點是同一父節點的子節點權重大小從左到右遞減
3.4.1 構建CT(ClimbingTree)圖
先將一個用戶的一個上報堆棧數據先進行預處理,包括解密文件、翻譯堆棧函數、格式化堆棧、過濾掉無關數據等步驟,最終生成一條業務函數調用關系鏈。
根據調用關系,合并同個用戶多個調用關系鏈,相同節點耗時相加,并按每個樹節點的耗時從左到右排序,生成函數調用關系樹(見圖3-3)
圖3-3 函數調用關系樹
合并多個用戶的調用關系樹,剪掉閾值下低權重的節點樹枝,就可以生成CT(ClimbingTree)。這棵樹里就包含了所有問題堆棧的數據聚集,并且問題嚴重程度從左到右排序(見圖3-4)。
圖假設每個節點耗時為1s,那么CT里A-B-C這條調用關系鏈很有可能就是問題所在的函數調用關系鏈(因為C節點對父節點的耗時占比為:2/4=50%)
圖3-4 CT圖
CT的優點在于將海量的數據聚集統計到少量的森林數據節點里(約壓縮90%-95%的數據量)
由于左子節點一定比右節點耗時長,所以往往左子節點即是影響父節點的問題所在,通過分析左子節點占父節點的耗時占比可以得到最根源的耗時函數所在(見圖3-4、圖3-5)
圖3-5 尋找最根源的耗時函數節點
3.5 終端常見性能問題總結
最常見的問題在主線程做長耗時操作,如
· 數據庫操作
· 網絡連接等待
· 網絡數據等待
· 復雜邏輯計算
· SD卡檢查或讀寫
常用的優化方法:
使用子線程做異步操作,如數據庫的寫操作,配置網絡拉取等可預加載的提前預加載,例如利用APP打開等待首頁的時間打開網絡長連接,對視頻音頻數據做預加載等
能延后處理的異步延后處理,如SD卡檢查,異步發消息等
3.6 案例&效果
- QQ IOS某幾個版本經過優化之后的卡慢投訴數據:
Qzone Android:某幾個版本的卡慢發生率(卡慢發生率=卡慢發生人數/使用人數)
4.總結
在高速發展的移動互聯網時代,運維技術要適應業務的變化,本文介紹的手機QQ和手機Qzone的速度優化實踐,是騰訊運維利用大數據技術為業務創造價值的小案例。
我們堅信隨著運維崗位的發展,不同垂直領域的運維分工也會隨之而生,如何能在不同的業務形態上,利用運維技術和數據為業務帶來更大的價值,用數據說話讓數據發聲,將是我們下一步探索的重點方向。
來自:http://www.yunweipai.com/archives/9203.html