王者榮耀高并發背后的故事
摘要
堪稱中國最火爆的手機游戲“王者榮耀”,擁有億級用戶體量,***日活用戶,如何快速、低成本地保障業務突發?本文從該問題出發,論述了問題對應的解決方案,并對其效果做出總結。
背景
“王者榮耀”是一款國民級手機游戲,用戶體量巨大,而且一直保持著較高的更新頻率。這種業務場景下,突發也變得非常頻繁,然而業務體驗是至關重要的,使用CDN必不可少。類似地,經常有帶寬突發的場景,比如新聞爆點視頻、大型直播活動、熱門影視劇上線、熱門游戲等應用發布。同時,由于家庭帶寬和移動網絡的快速升級,突發帶寬量級越來越大,經常達到Tb級,甚至10Tb 。如何快速、低成本地保障業務突發,成為CDN的一大挑戰。
2007年,騰訊自建CDN啟用,接入了***個業務騰訊網。到現在CDN帶寬量級,從最早的數十Gb,發展到現在的數十Tb;單業務的帶寬也越來越大,大部分業務常量帶寬在幾百Gb,部分突發業務達到了10Tb。網絡的快速升級,移動用戶爆發式增長,以及視頻類業務包括點播和直播的興起,使得業務突發越來越頻繁,突發帶寬越來越高,對CDN的要求也越來越高。
自建CDN得益于騰訊業務的蓬勃發展,先后支持了游戲下載、流媒體視頻加速、春節紅包等騰訊內部業務;2014年騰訊將CDN全面能力開放,成為騰訊云CDN產品,除承載內部業務外,也開始接入第三方客戶,比如快手點播、斗魚直播等。以上各種業務都有突發場景,也有很強的成本訴求,在如何低成本地保障業務突發,騰訊CDN積累了豐富的經驗。接下來就挑戰和問題、解決方案、效果三個方面來解析。
一、挑戰和問題
下面將從業務特點開始,分析目前存在的挑戰和問題。
1、 業務特點和挑戰
CDN多樣化的場景,注定了突發業務充滿挑戰。突發業務具有體量大、場景多樣化、 無規律等特點。
a) 體量大:突發業務帶寬大部分都超過Tb,部分甚至達到了10T ;
b) 場景多樣化:點播中的熱劇和新聞爆點;直播中的LOL/KPL/DOTA2等游戲直播,NBA/世界杯等體育直播,演唱會等綜藝直播;應用下載中的王者榮耀等游戲下載;靜態網頁加速中的紅包活動、電商促銷等;
c) 無規律:部分突發活動無法預知,活動快要開始或已經開始了才知道,比如新聞爆點。
體量大,需要準備更多的資源;場景多樣化,需要滿足不同的資源需求;無規律性則對我們的擴容效率提了很高的要求。
2、 目前存在的問題
僅僅為了滿足業務突發需求而儲備大量的資源,成本太高,會造成資源極大的浪費。所以一般會通過復用資源來應對業務突發。但是直接復用資源,存在兩個問題:
a) 只能復用部分資源:CDN業務,一般按業務類型來區分平臺和資源使用,主要原因是不同業務類型對資源需求不同,比如點播類需要更多的存儲;有較多https請求的靜態頁面類,則需要更多CPU資源。這種限制使得資源無法充分利用,加大了資源準備的難度。比如視頻突發主要使用視頻Buffer,而下載類和網頁類Buffer無法直接使用,這限制了Buffer的大小。即使復用同類型資源,因為涉及多個業務資源的協調,準備時間一般會超過兩天,無法應對臨時突發;
b) 無法降低成本:另外針對部分突發業務,比如游戲應用下載,帶寬高峰期在上午和中午,如果只使用本平臺資源,會導致結算帶寬明顯上漲,從而增加成本。無法利用同其他業務錯峰的特點來降低結算帶寬。
二、解決方案
騰訊云CDN通過虛擬化復用現有資源,搭建全業務通用的突發池,所有平臺共享Buffer。 突發池中的設備為Docker虛擬機,虛擬機有不同的規格,只要業務有需求,都可以按需使用。突發池中的帶寬儲備達到了10Tb,基本能滿足所有業務突發需求 。任何業務有突發需求,配合自動化上架接口,可在10分鐘完成10Tb突發池的擴容。
1、 突發池系統架構
突發池系統架構見圖1:
a) 突發池:在各平臺物理機的上層,由Docker虛擬機組成的資源池,對CPU/內存/磁盤等使用進行了限制,防止對物理機造成影響。原有業務依然部署在物理機上,不用調整。
b) 自動化部署和監控系統: 能根據業務實際需求,自動預測需求并擴容 。所有的突發需求,都能在10分鐘內擴容完成。針對點播/下載業務,自動分發熱點文件,降低回源帶寬。
c) 調度系統:突發業務的突發性和體量大兩個特點,使得相比域名調度系統,直通車更占優勢。直通車調度更靈活,生效時間快,能達到分鐘級。
虛擬機和物理機部署了上報Agent,業務信息和服務器負載每分鐘都會上報到監控系統。監控系統會根據歷史帶寬預測一個值,并與當前帶寬比較,如果當前帶寬超過預測值的50%,則認為有突發。根據帶寬上漲的比例,系統會自動從突發池中擴容相應數據的設備。針對提前準備的突發活動,運維可以指定帶寬需求量,之后系統便會自動計算設備需求并擴容。
分鐘粒度上報的服務器負載信息則為監控系統做調度決策提供了依據。系統會依據機房剩余帶寬、服務器帶寬、CPU、IO等綜合信息決定虛擬機是否需要從直通車中啟用或者禁用。用戶訪問時先請求直通車調度系統,直通車會根據調度策略返回一個302地址,302地址中為實際CDN資源地址。用戶跳轉到302地址,并獲取實際內容。
2、技術優化
使用虛擬化技術復用資源的重要前提是,不影響現有業務。這就要求對資源有充分的隔離,比如CPU/磁盤,以及對帶寬的使用。下面是實現過程中存在的幾個問題及解決方案:
- 精準控制單機負載:負載過高會影響業務質量,需要對單機負載進行精準的控制。
解決方案:
a) 配額系統:直通車中有配額系統,對每個虛擬機可使用的資源做了限制,包括CPU/IO和帶寬。監控系統中上報的信息,結合配額系統,可以確保服務器負載被限定在制定的范圍內,粒度為分鐘級。
b) 部分請求返回302:對CPU/帶寬/IO等做了限制后,應用程序能根據母機當前負載,實時判斷是否處理一個請求。如果負載在限制范圍內,直接處理;如果負載超出限制,則返回302,使用戶跳轉到直通車的調度地址,這樣能在盡量不影響業務質量的情況對負載做精準控制。程序層面對負載的實時控制,是配額系統的有效補充。
c) 網卡流量控制:在極端情況下,業務帶寬超過設定閾值,這時虛擬網卡會主動丟包,避免對母機造成影響。
- 限制磁盤大小:Docker在ext3/ext4文件系統中無法對文件/目錄級別進行磁盤大小限制。
解決方案:
由于騰訊云CDN業務基本都是使用ext3/ext4文件系統,這種情況下Docker只能對根據用戶或用戶組對磁盤進行限制,但現網業務都是直接在root環境下使用。這里我們使用loop device來解決磁盤大小限制問題。虛擬機中突發業務使用掛載在loop device上的目錄,這樣就可以間接限制磁盤大小,防止使用太多磁盤影響其他業務。
- CPU綁定:默認是綁定所有CPU,部分單CPU負載高會影響母機業務。
解決方案:
通過腳本每分鐘采集一次系統所有單CPU負載,為避免頻繁調整和受毛刺數據影響,取15分鐘的均值。***選取負載較低的部分核,并通過配置文件cpuset.cpus來動態綁定,將虛擬機對母機業務影響降低到最小,并且能充分利用資源。
效果
突發池上線后,高效支持了王者榮耀下載、NBA直播、KPL/LPL游戲直播等多次大型突發活動,節約成本2000萬。通過共享buffer,搭建突發池能顯著提高突發能力和降低成本。
總結
騰訊云CDN通過Docker技術復用資源,搭建Tb級別突發池,能支持直播、點播、靜態等各種業務突發,能自動檢測到業務突發需求并在10分鐘內完成資源擴容,具有發布快,成本低等特點。資源復用能提高資源利用率,為業務提供極大的突發池,但要注意復用業務之間不能相互影響,這需要對服務器進行實時的監控和及時的調度。另外還有一些待改進的地方,比如內核參數基于容器隔離,方便不同業務調優;部分業務客戶端不支持302跳轉,調度系統需要支持域名調度方式。