天天看點

日活上百萬時,騰訊産品如何提前規避伺服器當機風險?

衆所周知,優異的應用性能是良好使用者體驗的堅實基礎,而伺服器響應緩慢、卡頓、崩潰的産品,即便設計再精美也無法留住使用者的心。

2017年2月28日,百度就和使用者們開了一個不大不小的玩笑,從當天的20點54分到21點24分左右,百度搜尋整整當機了30分鐘,衆多網友戲言那30分鐘成為了百度最有存在感的30分鐘,但是從後來百度的公關文章中,可以看到其提到了“錯過了大家上億次的搜尋請求”,從這個體量來看,這無論如何都是一次很大的影響了。

日活上百萬時,騰訊産品如何提前規避伺服器當機風險?

無獨有偶,今日頭條也在今年的1月出現了當機現象,系統超過30分鐘未響應,頭條号的編輯背景也無法進入,這些現象,均給使用者帶來了很大的困擾,而且使用者體量越大,影響的波及面就越廣,不僅影響使用者口碑,也影響産品收入。

日活上百萬時,騰訊産品如何提前規避伺服器當機風險?

如果把産品的月收入平攤到每一分鐘的話,大家可以通過30分鐘,60分鐘,乃至12小時,24小時的停服時間計算具體的損失金額,還要加上是以産生的使用者流失以及品牌口碑影響。

某國外知名遊戲在上線之初沖擊到iOS免費榜第二名的時候,因為沒有做好應對大量玩家湧入的準備,伺服器卡死、當機,閃退讓玩家失望選擇離開,下載下傳排名一度下降到475,通過兩個月的伺服器優化才挽回局面。

這樣的例子有很多,随着重度遊戲,重度産品越來越多,産品越來越重視伺服器性能的優化。本文将結合騰訊WeTest團隊為騰訊遊戲及産品進行伺服器壓測的經驗,分享一些方法和思路。

關于伺服器壓測,有很多名額。為了讓大家更容易了解,舉個生活中的例子:

你中午去“海底撈”吃飯。

我們可以把“海底撈”這個飯店看成一個被測系統。

你去吃飯,就是對這個被測系統發起請求,對這個系統造成了一定的負載。你帶去的人越多,那麼這個餐館就越繁忙,可以說餐館承受的負載就越大。

你開始點菜。這個時候你隔壁桌的人也開始點菜。那麼你們兩個對這個系統産生了并發的請求。同時,其他桌有的在吃菜,有的在等菜,這些都是并發進行的事務。一個完整的吃飯事務可以定義成包括:點菜,下單,上菜,買單四個步驟。對于一個C/S的系統來說,可以對應于:建立連接配接,發送請求,接受應答,斷開連接配接。

影響一個餐館生意好壞的一個重要原因是上菜速度。上菜速度展現在兩個方面:

1.一個顧客請求的處理耗時,從下單到上菜中間等待的時間,我們稱之為響應時間。

2.這個餐館同時為多名顧客上菜的頻率,我們稱之為吞吐量。

來多少顧客,這是飯店自己無法控制的,但是飯店的上菜速度、餐位多少都會制約客流量。一定有一個峰值客流量,當來的客人超過了這個峰值,那麼這些客人就會等位,或者是上菜速度超慢讓客人無法容忍。容量測試就是通過工具模拟足夠多的顧客來吃飯的事務,希望找到這樣一個客流量對飯店産生一定的負載,這個時候飯店既能接待最多的客戶同時也能保證最短的等待時間。更多的,還可以對這個酒樓人員配置和餐位設定等進行調優,以期達到一個最理想的資源使用率和效率。

客流量跟進來的客人多少有關,也跟餐館的接待能力有關。單方面增加來就餐的顧客,遭到投訴的可能性就越大,上錯菜的可能性也越大。

1、90%響應時間

是指所有使用者的響應時間由小到大進行排序,第90%的響應時間,是用來評估系統容量的重要名額之一。

2、TPS性能,關注伺服器的服務能力。

每秒系統處理事務(通過、失敗以及停止)的數量。通過它可以确定系統在任何給定時刻的時間事務負載。

3、支援的最大線上人數。

指同時登入站點的最大人數或者伺服器同時接收下載下傳的最大數量。

4、伺服器自身壓測過程總CPU、記憶體等的變化情況。

CPU使用率是指:CPU執行非系統空閑程序的時間/CPU總的執行時間;記憶體占用率指的是此程序所開銷的記憶體。

5、事務成功率

事務成功率=成功處理的事務/所有事務*100%,是檢測伺服器處理事務成功幾率的重要名額。

為了能夠幫助使用者更快捷的獲得伺服器的核心資料,市場産生了諸多各式各樣的壓測方法,但也存在各式各樣的問題:

1、現網資料預估

根據壓力測試過程中的部分資料,對未來大量使用者通路的情況機型預估。

存在問題:隻适合簡單的伺服器拟合,複雜伺服器資料就不太準确。

2、真人壓測

通過邀請一定數量的真實使用者來玩遊戲,進而對伺服器達到一個測試效果。

存在問題:暴露出的性能問題有限,封測人數通常還是太少,雖然有幾百或者幾千使用者在玩,但是并發并不夠,不足以暴露服務端性能問題;另外不适合調優,真人無法完全重複相同行為,伺服器就難以進行回歸調優。

3、接口測試

選擇一些具有代表性的功能,通過以小見大的方式,來評估整套伺服器性能。

存在問題:無法周遊整個伺服器的接口,難以避免一些微小的問題。

4、錄制回放

通過抓取資料包的方式,來擷取遊戲時的協定,再把這些捕獲的協定重新發送給服務端,通過工具放大協定量級達到性能測試的目的。

存在問題:面對複雜的協定互動,單純的放大資料包,無法産生足夠壓力。

5、機器人模拟

通過高還原真實玩家的使用者行為,模拟高并發場景,進而得到類似很多人同時遊戲的測試效果。

這些方法各有優劣,騰訊内部普遍使用“機器人模拟”的方法進行壓測,而“機器人模拟”的壓測方法需要充足的測試時間和很大的人力投入,為此騰訊制定了一個較為通用的測試流程,用以提升壓測效率。

根據騰訊内部遊戲和産品的使用需求,騰訊WeTest團隊首先針對http與https協定的頁面,梳理了一個通用的壓測流程。

1、 确定壓測場景,比如登入,擷取資訊清單等

測試人員第一步要做的就是測試方案的确認,主要就是提前模拟實際業務中涉及的場景以及場景中使用者的使用行為,通常需要确認這樣幾點:

1) 确認使用者的登入狀态,使用者的登入态是否會不斷變化

2) 使用者登入後的通路路徑之間的上下文關系

3) 通路路徑之間的參數傳遞關系

2、 測試人員編寫測試用例

編寫測試用例就是将上述模拟場景具體化的過程,包括确認壓測的人數,人數遞增邏輯,具體需要壓的接口,接口之間的參數傳遞等。

3、 啟動機器人進行測試,漸進增加機器人數量

在确認了測試方案後,這一步就是執行的過程,根據測試方案中預估的壓力人數,漸進的增加壓力的人數。

4、 記錄分析資料及事務處理情況,檢視伺服器負載的變化以及伺服器的目前承載能力。

上一步提到了要漸進增加機器人,那麼為什麼要漸進增加機器人?因為在伺服器并發增加的過程中需要不斷監控上文伺服器的核心資料,不斷挑戰伺服器處理能力的極限,避免上來就使用一個過高的并發數直接超過了伺服器處理能力的極限,進而無法起到性能優化的目的。一般來說,在機器人增加的過程中,CPU的突然跑滿以及響應時間瞬間變長,都可能是伺服器産生了瓶頸。是以壓測人員需要實時監控壓測上升過程中的伺服器情況變化,進而定位問題所在。

5、 調整配置,疊代測試,預估伺服器的承載能力以及可能存在的性能瓶頸

在發現基本的測試問題後,測試人員需要通過不斷的調試來定位問題,然後重新發起壓測,知道實作最終的測試目的。

根據這個測試流程,騰訊内部也總結了一些壓測産品所需要具備的特點 :

1) 簡單易上手

産品的業務場景是多變的,但是好的壓測産品應該讓這個場景配置過程變得簡單易用,使用者在簡單輸入需要壓測的URL即可進行各個接口的測試,大部分測試配置建議提供一個預設值,使用者對功能更加了解之後可以自由配置這些參數。

2) 進階功能完善

除了簡單易用之外,也要給使用者提供一些進階的功能,在簡單輸入URL的基礎上,可以支援使用者自定義變量,從檔案讀取變量,甚至從其他URL的傳回值擷取變量的值,可以比較真實模拟真實場景,避免請求變量單一。

3) 提供分布式壓力機進行壓測

由于單機的局限性,壓測産品可以使用分布式壓測的架構,根據使用者配置的機器人數量動态配置設定多個壓測機,極大提升壓力上限。

4) 詳細的測試資料統計

壓測大師會記錄測試過程中的多項資料,包括線上人數變化、TPS變化、響應時間、收發包流量、伺服器CPU記憶體狀态、壓力機硬體負載、測試結果統計等,可以快速定位伺服器的容量以及瓶頸。

基于這些需求,騰訊WeTest團隊開發了專注伺服器壓測的産品“壓測大師”,簡化了壓測配置過程,使用者可以線上上部署,線上調試,線上檢視報告,幫助使用者成為最高效的“壓測大師”。

騰訊NOW直播是騰訊目前發展非常迅速的直播應用,在其一場線上活動中,需要對活動的所有接口進行壓力測試,提前暴露問題并解決,確定活動的順利實施。為此,NOW直播團隊選擇使用“壓測大師”,對活動進行了一整套場景測試。

“壓測大師”包含“頁面測試”,“URL測試”和“進階模式”三塊功能。

“頁面測試”适用于HTTP、HTTPS協定,可對Web,H5等頁面進行壓力測試,主要測試頁面靜态資源的壓力資料,幫助提升官網推廣大型營運活動時網站的穩定性;

在“URL測試”中,使用者可以設定使用者并發增長形式,不同URL的上下文參數配置以及伺服器監控,實作最多同時16個使用者場景,實作更多的場景配置;

而“進階模式”适用于HTTPS及其他協定,包括自定義協定等。支援對遊戲,産品協定進行壓力測試,使用者通過代碼配置,可以根據自身需求開啟協定壓測。

在測試過程中,NOW直播團隊首先梳理了測試思路,一方面通過單接口壓測,提前暴露核心子產品的問題;另一方面通過多接口的場景設定,盡量模拟真實使用者行為,使得壓測結果更有說服力。

在測試過程中,《NOW直播》利用”壓測大師“的URL測試功能,針對“發消息”“點贊”“拉取公告”“注冊”“讀取房間資訊”“進入房間”等各個獨立行為進行單接口壓測,通過設定壓測起始人數,每階段增長人數以及最大人數(見下圖),設計接口的壓力情況。

日活上百萬時,騰訊産品如何提前規避伺服器當機風險?

“壓測大師”URL測試中的“人數設定”

另外對于使用者不同的通路行為,《NOW直播》對“注冊-房間資訊-進房”進行了多場景的壓測(見下圖),通過GET請求,讀取一個使用者的“登入态”,通過功能接口随機産生不同行為邏輯的機器人,模拟真實的QQ使用者;然後通過POST請求依次執行具體的業務行為,最後通過URL測試中的“上下文配置”,選擇調用不同的功能接口,進而發現功能之間産生的邏輯問題。

日活上百萬時,騰訊産品如何提前規避伺服器當機風險?

“壓測大師”URL測試中的“上下文設定”

經過幾天緊張的測試,NOW直播活動的各個場景資料都得到了大大的提升,其中“使用者進入房間”場景的響應時間減少了近一半;“使用者發送消息”與“點贊”場景的TPS提升四倍,為活動的穩定開展提供了堅實的保障。

無論是遊戲還是産品,騰訊經曆過無數次伺服器的考驗,面對這些考驗,騰訊也漸漸總結出了一套通用的應用性能管了解決方案,讓使用者能夠在遊戲上線之前基于真實業務場景和使用者行為進行壓力測試,發現伺服器端的性能瓶頸,并進行針對性的性能調優。以上内容也是根據騰訊産品無數次的壓測總結下來的一些經驗,騰訊WeTest團隊也希望通過“壓測大師“這類産品,不斷簡化伺服器壓測的過程,提升壓測人員的工作效率。

功能目前免費對外開放中,歡迎大家的體驗 !

體驗位址:http://wetest.qq.com/gaps/