自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

【干貨】手機(jī)QQ及Qzone速度優(yōu)化實(shí)踐

移動(dòng)開發(fā)
移動(dòng)互聯(lián)網(wǎng)發(fā)展那么快,運(yùn)維技術(shù)也要適應(yīng)業(yè)務(wù)的變化啊,這次小編找了騰訊牛人介紹的手機(jī)QQ和手機(jī)Qzone的速度優(yōu)化實(shí)踐。

作者介紹:

黃浩宇

現(xiàn)就職于騰訊社交網(wǎng)絡(luò)運(yùn)營部,負(fù)責(zé)SNG社交網(wǎng)絡(luò)業(yè)務(wù)移動(dòng)類產(chǎn)品的業(yè)務(wù)運(yùn)維工作,如QQ、Qzone業(yè)務(wù)優(yōu)化及開發(fā)。

此前任職于阿里巴巴,負(fù)責(zé)天貓商城活動(dòng)類業(yè)務(wù)的運(yùn)維工作,如天貓雙11,天貓周年慶等。

導(dǎo)語

移動(dòng)互聯(lián)網(wǎng)發(fā)展那么快,運(yùn)維技術(shù)也要適應(yīng)業(yè)務(wù)的變化啊,這次小編找了騰訊牛人介紹的手機(jī)QQ和手機(jī)Qzone的速度優(yōu)化實(shí)踐。

我們堅(jiān)信不同垂直領(lǐng)域的運(yùn)維分工會(huì)越來越不同,如何能在不同的業(yè)務(wù)形態(tài)上,利用運(yùn)維技術(shù)和數(shù)據(jù)為業(yè)務(wù)帶來更大的價(jià)值,將是我們下一步探索的重點(diǎn)方向。

1. 關(guān)于用戶等待時(shí)間

對用戶來說,最直觀的感受就是APP的等待時(shí)間,所以我們首先要分析清楚APP到底在哪里讓用戶等待,耗時(shí)在哪里。

等待時(shí)間無非就以下三個(gè):

  • Server處理耗時(shí)
  • 網(wǎng)絡(luò)傳輸耗時(shí)
  • 客戶端數(shù)據(jù)處理/UI渲染耗時(shí)

QQ/Qzone等產(chǎn)品由于已經(jīng)有多年的Server端優(yōu)化,大部分?jǐn)?shù)據(jù)都是直接讀寫nosql數(shù)據(jù)庫,接口耗時(shí)基本都在30-120ms,優(yōu)化Server實(shí)際的收益并不會(huì)很大。

下面主要介紹后兩個(gè)方向上的優(yōu)化實(shí)踐。

2. 網(wǎng)絡(luò)傳輸

首先我們需要統(tǒng)計(jì)數(shù)據(jù)在網(wǎng)絡(luò)傳輸?shù)暮臅r(shí)情況,才能知道優(yōu)化網(wǎng)絡(luò)傳輸有多少價(jià)值

2.1 網(wǎng)絡(luò)傳輸耗時(shí)統(tǒng)計(jì)

網(wǎng)絡(luò)耗時(shí)通過TCP協(xié)議的三次握手在服務(wù)端進(jìn)行統(tǒng)計(jì),優(yōu)點(diǎn)是簡單快速低成本,具體方案如下:

  1. 記錄下第一次握手時(shí)服務(wù)端收到SYNC包的時(shí)間Time1
  2. 記錄下第三次握手時(shí)服務(wù)端收到的ACK包時(shí)間Time2
  3. 兩個(gè)時(shí)間之差即是網(wǎng)絡(luò)往返耗時(shí)RT(Time2-Time1)(見圖2.1) 

 [[193829]]  

圖2.1 從服務(wù)端測網(wǎng)絡(luò)延時(shí)

通過實(shí)際數(shù)據(jù)統(tǒng)計(jì),在不跨網(wǎng)訪問的情況下(信號(hào)正常):

  • 4G耗時(shí)約30-100ms
  • 3G耗時(shí)約 200-400ms

從速度結(jié)果上看,目前主流的3G/4G網(wǎng)速還是相當(dāng)不錯(cuò)的,但是由于移動(dòng)網(wǎng)絡(luò)的復(fù)雜性,從QQ和空間的業(yè)務(wù)返回碼監(jiān)控上還是發(fā)現(xiàn)有不少問題:

  • 跨網(wǎng)訪問
  • 跨地區(qū)訪問
  • 某些小運(yùn)營商劫持等

下面分享下手機(jī)Qzone在接入組件的優(yōu)化策略

2.2 手機(jī)Qzone WNS接入策略

簡介:WNS,手機(jī)QQ空間APP到服務(wù)端通信框架,支持tcp、http協(xié)議

2.2.1使用私有協(xié)議直接IP長連接訪問(圖2.2)

優(yōu)點(diǎn):

  • 減少DNS請求耗時(shí)
  • 避免DNS域名劫持
  • 單個(gè)連接并發(fā)多個(gè)數(shù)據(jù)請求減少連接數(shù)的開銷(相對http)
  • 私服協(xié)議加密安全;

缺點(diǎn):由于不走域名,首次連接需要額外的策略來找到合適的接入點(diǎn),并且需要有重定向能力

 

圖2.2 私有協(xié)議直接IP長連接

2.2.2 首次連接策略

世界上最遙遠(yuǎn)的距離就是你在聯(lián)通,而我在電信。在復(fù)雜的移動(dòng)網(wǎng)絡(luò)環(huán)境下,我們需要優(yōu)化網(wǎng)絡(luò)的接入策略避免跨網(wǎng)/跨地區(qū)訪問。

使用移動(dòng)網(wǎng)絡(luò)時(shí)我們先識(shí)別用戶的運(yùn)營商,同時(shí)起4個(gè)連接,多個(gè)接入IP+多個(gè)端口+2種協(xié)議,再同時(shí)使用2種協(xié)議和多個(gè)端口是為了避免有些本地運(yùn)營商的限制,使用第一個(gè)連接上的連接(見圖2.3)

 

圖2.3 首次并發(fā)嘗試連接

使用WIFI的用戶首次連接會(huì)優(yōu)先使用域名嘗試連接。

當(dāng)上面策略都連不上時(shí)客戶端會(huì)運(yùn)行打分策略,使用備份IP列表連上一個(gè)速度最快的接入。

騰訊擁有國內(nèi)大量的CDN節(jié)點(diǎn),即使是偏遠(yuǎn)地區(qū)也可以通過CDN節(jié)點(diǎn)接入做為代理!

優(yōu)點(diǎn):多種首次連接策略能有效的保證用戶最大可能的先連上服務(wù)器,這在復(fù)雜的移動(dòng)網(wǎng)絡(luò)中特別重要!

缺點(diǎn):首次連接有額外開銷;連接上不一定是最優(yōu)的接入點(diǎn);使用CDN節(jié)點(diǎn)做為代理接入成本較高

2.2.3 最優(yōu)接入&重定向

連接上之后服務(wù)端通過GSLB IP庫識(shí)別用戶的出口IP,如果發(fā)現(xiàn)用戶的接入不是最優(yōu)的接入,通過大數(shù)據(jù)分析該用戶在某個(gè)時(shí)段最應(yīng)該使用的接入點(diǎn),會(huì)下發(fā)重定向指令,讓客戶端連接到最優(yōu)的服務(wù)端接入IP,WIFI下還會(huì)緩存住SSID和接入IP。

優(yōu)點(diǎn):讓用戶能就近/最優(yōu)接入,減少網(wǎng)絡(luò)的耗時(shí)

缺點(diǎn):少部分用戶首次使用需要連接2次服務(wù)器;

2.2.4 使用字典做數(shù)據(jù)壓縮

減少帶寬開銷;安全

2.2.5 心跳

避免長連接斷開

2.2.6 單連接并發(fā)請求

相對多連接單請求的傳統(tǒng)HTTP模式(HTTP 2.0之前),用單連接可以大大減少客戶端和服務(wù)端開銷

結(jié)論

移動(dòng)網(wǎng)絡(luò)上我們能做的優(yōu)化無非就是減少連接,減少請求,避免跨網(wǎng)跨區(qū),優(yōu)化協(xié)議。而隨著4G/光纖的快速發(fā)展,以后越來越多用戶在網(wǎng)絡(luò)上的耗時(shí)會(huì)越來越少,意味著我們網(wǎng)絡(luò)策略上的優(yōu)化效果收益也會(huì)越來越低,這時(shí)我們把目光投向終端。

3. 終端耗時(shí)

同上,首先需要確認(rèn)終端的耗時(shí)情況以確認(rèn)優(yōu)化預(yù)期和目標(biāo)。

通過在客戶端埋點(diǎn)的上報(bào)監(jiān)控,發(fā)現(xiàn)手機(jī)Qzone某個(gè)灰度版本用戶一些操作之后3秒以上沒響應(yīng)比率最高達(dá)30%;手機(jī)QQ某個(gè)灰度版本由于UI問題導(dǎo)致畫面掉幀比率約15%,在投訴的問題分類中,卡、慢、卡頓投訴量長期居前三甲。

可以得出這樣的結(jié)論:終端的問題很嚴(yán)重,而且跟用戶操作體驗(yàn)直接相關(guān)!

3.1 Android/IOS系統(tǒng)背景

既然是想優(yōu)化移動(dòng)客戶端,那對于操作系統(tǒng)(Android和IOS)需要有個(gè)基本的了解,兩者都是基于UNIX/LINUX開發(fā)的系統(tǒng),對于運(yùn)維人員來說很多概念都很好理解。

其中比較重要的一條設(shè)計(jì)理念是:Android和IOS都能進(jìn)行多線程開發(fā),其中有一個(gè)是主線程也稱UI線程,UI線程是唯一有權(quán)限操作用戶UI的線程,如果用戶在操作有體驗(yàn)上的問題,那肯定是因?yàn)橹骶€程被堵塞或沒有足夠的運(yùn)行資源。所以從主線程的監(jiān)控和系統(tǒng)資源的占用入手。

3.2 監(jiān)控的策略

怎么判斷終端出現(xiàn)卡慢等性能問題呢?通過上面對andoid和ios的背景介紹,我們的目標(biāo)放在主線程的監(jiān)控上,這邊主要有2種監(jiān)控策略:

1).監(jiān)控函數(shù)間調(diào)用耗時(shí)

當(dāng)主線程調(diào)用函數(shù)調(diào)用超過N秒時(shí),主線程處于等待堵塞狀態(tài),用戶所有UI行為暫停,所以認(rèn)為終端出現(xiàn)卡的情況。

缺點(diǎn):無法準(zhǔn)確反應(yīng)用戶的體驗(yàn)

優(yōu)點(diǎn):實(shí)現(xiàn)成本低,開銷低

2).監(jiān)控屏幕FPS,監(jiān)控掉幀數(shù)

當(dāng)用戶操作時(shí)發(fā)生頁面掉幀時(shí),認(rèn)為用戶發(fā)生卡慢或卡頓(如圖3-1)

優(yōu)點(diǎn):真實(shí)反應(yīng)用戶的體驗(yàn),而且能對卡慢卡頓的體驗(yàn)分級(jí),如分為短卡、長卡

缺點(diǎn):有額外的FPS監(jiān)控開銷,經(jīng)過測試該開銷大概占整個(gè)APP開銷的2%

 

如圖3-1監(jiān)控屏幕FPS的次數(shù)

3.3 堆棧的采集

監(jiān)控的策略有,接下來應(yīng)該考慮怎樣配合監(jiān)控策略,把“案發(fā)現(xiàn)場”的數(shù)據(jù)獲取出來并上報(bào)至服務(wù)端。

“案發(fā)現(xiàn)場”數(shù)據(jù)除了系統(tǒng)資源,如CPU、內(nèi)存等,最重要的一定是代碼的執(zhí)行堆棧數(shù)據(jù)。由于移動(dòng)終端性能資源有限,在采集堆棧數(shù)據(jù)的時(shí)候要非常注意對系統(tǒng)的影響,所以需要定好觸發(fā)采集堆棧的時(shí)機(jī),這邊主要也有2種采集方案:

3.3.1 開啟額外的線程記錄主線程堆棧

額外啟動(dòng)一個(gè)子線程,子線程記錄著主線程的堆棧數(shù)據(jù),當(dāng)發(fā)生卡頓的時(shí)候從該線程獲取到堆棧數(shù)據(jù),優(yōu)點(diǎn)是只需要引入一個(gè)很小的SDK包,而且無視版本的編譯方法和虛擬機(jī)。獲取堆棧的策略也分為 消極策略和積極策略

消極策略:

認(rèn)為卡慢卡頓的問題在短時(shí)間內(nèi)只會(huì)發(fā)生一次,如果錯(cuò)過了將無法獲取到真實(shí)的現(xiàn)場堆棧。

該策略的做法是:子線程時(shí)刻獲取著主線程的堆棧,當(dāng)主線程發(fā)生問題時(shí),通過發(fā)生問題的開始時(shí)間戳和結(jié)束時(shí)間戳,在子線程獲取到案發(fā)時(shí)的堆棧數(shù)據(jù)(如圖3-2)

缺點(diǎn):需要子線程時(shí)刻記錄主線程堆棧,開銷大

優(yōu)點(diǎn):獲取到的堆棧數(shù)據(jù)準(zhǔn)確 

 

圖3-1監(jiān)控主線程函數(shù)調(diào)用耗時(shí)

積極策略:

認(rèn)為卡慢卡頓的問題在短時(shí)間內(nèi)會(huì)發(fā)生幾次或持續(xù)發(fā)生一段時(shí)間。

該策略的做法是:當(dāng)主線程發(fā)生問題時(shí),激活子線程獲取堆棧,在接下來的N秒內(nèi)在子線程獲取X個(gè)堆棧

缺點(diǎn):堆棧有隨機(jī)性,獲取到的堆棧是案發(fā)后的堆棧

優(yōu)點(diǎn):額外開銷極少,對APP基本沒影響

3.3.2 在編譯階段打樁/嵌入埋點(diǎn)

通過在編譯階段使用工具在每個(gè)函數(shù)調(diào)用點(diǎn)加入耗時(shí)統(tǒng)計(jì)函數(shù)

缺點(diǎn):增加APP包大小,經(jīng)過測試約增加APP10~20%的包大小,而且不同編譯方法和虛擬機(jī)需要不同的工具支持打樁嵌入;缺少系統(tǒng)調(diào)用數(shù)據(jù)

優(yōu)點(diǎn):無需運(yùn)行時(shí)的額外線程額外開銷

2種方案都各有優(yōu)點(diǎn)各有可取之處,但由于產(chǎn)品對包大小有嚴(yán)格限制,目前在QQ和Qzone主要采用方案1

3.4 大數(shù)據(jù)聚類分析

前面提到,方案1的消極策略對終端性能影響較大,但是積極策略獲取到的數(shù)據(jù)有隨機(jī)性,即客戶端無法精確的捕獲到問題堆棧。

而目前我們主要采用積極策略+大數(shù)據(jù)聚類分析的方法來分析問題。這一方案的基本思想是如果一段邏輯代碼真的有性能問題,那大多數(shù)用戶都發(fā)生。

所以我們采用對堆棧數(shù)據(jù)做聚類分析的方法,將能形成數(shù)據(jù)規(guī)模的堆棧找出來,過濾掉偶爾由于隨機(jī)性獲取到的無關(guān)堆棧。

對堆棧的聚類統(tǒng)計(jì)上,我們主要通過構(gòu)建CT(ClimbingTree)來解決。

ClimbingTree是內(nèi)部叫法,主要思路是通過堆棧生成堆棧樹,并利用海量數(shù)據(jù)加權(quán)計(jì)算(主要是函數(shù)耗時(shí))到樹上,最后根據(jù)權(quán)重將同層節(jié)點(diǎn)運(yùn)行從左到右進(jìn)行排序,并將設(shè)定閾值以下的節(jié)點(diǎn)運(yùn)行剪枝。

ClimbingTree的特點(diǎn)是同一父節(jié)點(diǎn)的子節(jié)點(diǎn)權(quán)重大小從左到右遞減

3.4.1 構(gòu)建CT(ClimbingTree)圖

先將一個(gè)用戶的一個(gè)上報(bào)堆棧數(shù)據(jù)先進(jìn)行預(yù)處理,包括解密文件、翻譯堆棧函數(shù)、格式化堆棧、過濾掉無關(guān)數(shù)據(jù)等步驟,最終生成一條業(yè)務(wù)函數(shù)調(diào)用關(guān)系鏈。

根據(jù)調(diào)用關(guān)系,合并同個(gè)用戶多個(gè)調(diào)用關(guān)系鏈,相同節(jié)點(diǎn)耗時(shí)相加,并按每個(gè)樹節(jié)點(diǎn)的耗時(shí)從左到右排序,生成函數(shù)調(diào)用關(guān)系樹(見圖3-3)

圖3-3 函數(shù)調(diào)用關(guān)系樹

合并多個(gè)用戶的調(diào)用關(guān)系樹,剪掉閾值下低權(quán)重的節(jié)點(diǎn)樹枝,就可以生成CT(ClimbingTree)。這棵樹里就包含了所有問題堆棧的數(shù)據(jù)聚集,并且問題嚴(yán)重程度從左到右排序(見圖3-4)。

圖假設(shè)每個(gè)節(jié)點(diǎn)耗時(shí)為1s,那么CT里A-B-C這條調(diào)用關(guān)系鏈很有可能就是問題所在的函數(shù)調(diào)用關(guān)系鏈(因?yàn)镃節(jié)點(diǎn)對父節(jié)點(diǎn)的耗時(shí)占比為:2/4=50%)

 

圖3-4 CT圖

CT的優(yōu)點(diǎn)在于將海量的數(shù)據(jù)聚集統(tǒng)計(jì)到少量的森林?jǐn)?shù)據(jù)節(jié)點(diǎn)里(約壓縮90%-95%的數(shù)據(jù)量)

由于左子節(jié)點(diǎn)一定比右節(jié)點(diǎn)耗時(shí)長,所以往往左子節(jié)點(diǎn)即是影響父節(jié)點(diǎn)的問題所在,通過分析左子節(jié)點(diǎn)占父節(jié)點(diǎn)的耗時(shí)占比可以得到最根源的耗時(shí)函數(shù)所在(見圖3-4、圖3-5)  

 

圖3-5 尋找最根源的耗時(shí)函數(shù)節(jié)點(diǎn)

3.5 終端常見性能問題總結(jié)

最常見的問題在主線程做長耗時(shí)操作,如

  • 數(shù)據(jù)庫操作
  • 網(wǎng)絡(luò)連接等待
  • 網(wǎng)絡(luò)數(shù)據(jù)等待
  • 復(fù)雜邏輯計(jì)算
  • SD卡檢查或讀寫

常用的優(yōu)化方法:

使用子線程做異步操作,如數(shù)據(jù)庫的寫操作,配置網(wǎng)絡(luò)拉取等可預(yù)加載的提前預(yù)加載,例如利用APP打開等待首頁的時(shí)間打開網(wǎng)絡(luò)長連接,對視頻音頻數(shù)據(jù)做預(yù)加載等

能延后處理的異步延后處理,如SD卡檢查,異步發(fā)消息等

3.6 案例&效果

QQ IOS某幾個(gè)版本經(jīng)過優(yōu)化之后的卡慢投訴數(shù)據(jù):

 

Qzone Android:某幾個(gè)版本的卡慢發(fā)生率(卡慢發(fā)生率=卡慢發(fā)生人數(shù)/使用人數(shù)) 

 

4.總結(jié)

在高速發(fā)展的移動(dòng)互聯(lián)網(wǎng)時(shí)代,運(yùn)維技術(shù)要適應(yīng)業(yè)務(wù)的變化,本文介紹的手機(jī)QQ和手機(jī)Qzone的速度優(yōu)化實(shí)踐,是騰訊運(yùn)維利用大數(shù)據(jù)技術(shù)為業(yè)務(wù)創(chuàng)造價(jià)值的小案例。

我們堅(jiān)信隨著運(yùn)維崗位的發(fā)展,不同垂直領(lǐng)域的運(yùn)維分工也會(huì)隨之而生,如何能在不同的業(yè)務(wù)形態(tài)上,利用運(yùn)維技術(shù)和數(shù)據(jù)為業(yè)務(wù)帶來更大的價(jià)值,用數(shù)據(jù)說話讓數(shù)據(jù)發(fā)聲,將是我們下一步探索的重點(diǎn)方向。 

責(zé)任編輯:龐桂玉 來源: Android技術(shù)之家
相關(guān)推薦

2024-12-03 11:12:47

2019-11-05 10:00:06

手機(jī)QQQQ空間QQ

2019-03-15 15:00:49

Webpack構(gòu)建速度前端

2011-06-29 14:27:58

網(wǎng)站優(yōu)化

2021-07-28 10:10:30

ITIT領(lǐng)導(dǎo)IT管理

2021-01-08 09:40:40

優(yōu)化VUE性能

2011-10-21 15:39:29

手機(jī)QQ手機(jī)管家

2009-07-14 10:13:38

MyEclipse優(yōu)化

2023-05-12 09:58:05

編譯優(yōu)化

2021-12-24 08:01:44

Webpack優(yōu)化打包

2022-05-12 11:41:16

開發(fā)框架程序

2011-09-26 14:51:05

QQ手機(jī)管家

2011-11-10 18:56:40

2011-10-21 14:57:32

QQ手機(jī)管家Android節(jié)電

2021-02-09 07:35:16

手機(jī)QQ紅包APP

2021-07-25 09:18:04

QQ騰訊移動(dòng)應(yīng)用

2020-03-23 15:15:57

MySQL性能優(yōu)化數(shù)據(jù)庫

2013-03-27 09:17:17

Android開發(fā)AndroidList

2009-06-25 14:09:37

優(yōu)化MyEclipse

2024-07-26 21:29:37

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)