虛擬化專家肖力:五年游戲虛擬化運維實踐
本文是我五年游戲虛擬化運維實踐的總結(jié),主要分享以下幾項內(nèi)容:
為什么要搞游戲虛擬化
那些游戲適合/不適合虛擬化
游戲虛擬化如何實施
實施過程中要解決那些問題
實施過程中有那些虛擬化技術(shù)要點
虛擬化的存儲方式
虛擬機資源限制
虛擬化運維中的監(jiān)控、報警、災(zāi)備及應(yīng)急響應(yīng)要點是什么
軟硬件選型
說到底就是一句話,如何將游戲遷移到虛擬化環(huán)境中,并穩(wěn)定運行。
為什么要搞游戲虛擬化
為什么要搞游戲虛擬化,或者說虛擬化給游戲帶來什么。
***點,也是最重要的一點是可以節(jié)省成本。舉一個例子,假設(shè)有一款游戲,有一個區(qū)組,有40臺服務(wù)器,40臺服務(wù)器根據(jù)高度的不同,通常占用3-5個機柜,就算是3個機柜吧?,F(xiàn)在假設(shè)能按照1:5的比例去做虛擬化,那么40臺服務(wù)器就可以被壓縮到8臺,8臺服務(wù)器最多只占用一個機柜,這樣我們節(jié)省了至少32臺服務(wù)器,2個機柜!對硬件成本的節(jié)約是非常驚人的。
第二點,資源隔離,虛擬化一個重要的特點就是實現(xiàn)了資源隔離,假設(shè)我們要在同一臺物理機上部署兩款游戲,這個是非常困難的,因為有端口、配置文件的沖突,甚至兩款游戲的維護時間也是不一樣的,如果一款游戲維護的時候需要重啟服務(wù)器,會影響另外一款游戲的運行。使用虛擬化就可以很好的解決這個問題,我們可以在同一臺宿主機上的兩臺虛擬機分別部署一款游戲,不會有任何沖突,虛擬化的隔離性可以很好的解決這個問題。
第三點,快速部署。從宿主機角度看,虛擬機就是一個鏡像文件,要得到另外一臺虛擬機,只需要將鏡像文件復(fù)制一份就可以,這個通常是幾分鐘,最多十幾分鐘。而我們要得到一臺物理機,從上架、插電源線網(wǎng)線、安裝操作系統(tǒng),及時一個熟練手都要個把小時。這個完全是一個數(shù)量級的差別。
虛擬機的快速部署特別適合手游頁游,因為大家知道手游頁游有一個特點就是開區(qū)并組非常頻繁,虛擬化剛好可以滿足這個需求,這也是為什么大部分手游頁游都喜歡用虛擬化的原因。
那些游戲適合/不適合虛擬化
那么那些游戲適合虛擬化呢,***種是單進程的游戲,這個主要是一些比較老的端游,游戲開發(fā)的時候還沒有多核CPU的概念,這類游戲特別適合虛擬化。
第二種是生命周期進入中后期,人數(shù)比較穩(wěn)定,消耗的壓力也***將幾個區(qū)組整合到一臺宿主機,就可以達(dá)到整合資源的目的。
虛擬化整合資料案例
舉一個例子,我曾經(jīng)做過一款游戲,使用500多臺物理機,這款游戲當(dāng)時已經(jīng)收支平衡,換句話說已經(jīng)不爭錢了,面臨著馬上被結(jié)項的命運,因為實施了虛擬機,按照1:7的比例進行整合,將500多物理臺服務(wù)器,壓縮到了70多臺宿主機上,大大的節(jié)省了游戲的運營成本。這個游戲項目又開始盈利了,又能在生存一段時間。
第三種是手游和頁游,上面已經(jīng)介紹過了。尤其是手游,開發(fā)周期很短,程序沒有時間精力去做系統(tǒng)層面的優(yōu)化,只能通過虛擬化進行擬補。
那么是不是所以游戲都適合虛擬化呢,壓力特別高的游戲就不適合虛擬化,如果在物理機上壓力已經(jīng)非常高了,我們就很難通過虛擬化在對游戲進行整合了,這類游戲就不適合虛擬化。
游戲虛擬化如何實施
游戲虛擬化的實施建議按照以下步驟實施,可以保證游戲比較平穩(wěn)的遷移到虛擬化平臺上。
首先需要去做業(yè)務(wù)性能需求評估,主要是評估業(yè)務(wù)的壓力狀況,性能數(shù)據(jù)可以去看監(jiān)控平臺,也可以用腳本去抓取,得到業(yè)務(wù)的壓力模型后,根據(jù)壓力模型就可以設(shè)計業(yè)務(wù)的虛擬化方案。
虛擬化方案的設(shè)計主要是宿主機如何選型,虛擬化比例如何確定。然后我們會搭建一個測試環(huán)境,進行測試。
測試包含兩部分,系統(tǒng)綜合測試和業(yè)務(wù)壓力測試。系統(tǒng)綜合測試主要是測試宿主機、虛擬機磁盤、網(wǎng)絡(luò)各方面的性能瓶頸點,取得極限數(shù)據(jù),做到使用的時候心中有數(shù)。業(yè)務(wù)測試主要是測試游戲程序能否在虛擬機上運行起來,從客戶端能否正常登錄游戲,正常的玩游戲,一臺虛擬機***可以負(fù)載多少游戲人數(shù)。
測試沒有問題后,進入小規(guī)模的部署,一般是先開一個體驗服,跑2周時間,然后找人數(shù)最少的一個區(qū)組,跑2周到4周,然后在找人數(shù)最多的一個區(qū)組,跑2周到4周,沒有問題后,逐步的將游戲遷移到虛擬化環(huán)境,直至進入最終的虛擬化運維。
關(guān)于測試時間一個慘痛教訓(xùn)的案例
當(dāng)時我們有一款游戲,是一款比較老的端游,前期做了大量的機器人壓力測試,都沒有問題,又開了體驗服測試,也沒有問題,然后在生產(chǎn)環(huán)境上了人數(shù)最少的一個區(qū)組,跑了一周,也沒有問題,這時候覺得應(yīng)該沒有問題了,有點急躁,一下子上來好幾個區(qū)組,這些區(qū)組虛擬化一周以后很穩(wěn)定,但是到了第二周的周四,開始出現(xiàn)頻繁的游戲進程宕掉,玩家大面積掉線的情況。這時候就非常被動,只能硬著頭皮去解決了,現(xiàn)在回想起來,如果當(dāng)時***個生產(chǎn)環(huán)境虛擬化的區(qū)組能測試的時間長一些,讓這個問題提早暴露出來,至少影響面要小的很多。
游戲虛擬化實施過程中要解決那些問題
***點是穩(wěn)定性,穩(wěn)定性尤其在游戲行業(yè)特別重要,因為穩(wěn)定性是和收入掛鉤的,沒有了穩(wěn)定性就沒有了收入,搞任何的節(jié)省成本都沒有意義的。
第二點是快速的管理維護,穩(wěn)定性解決之后,面臨的下一個問題就是如何快速的得到一臺或者一批虛擬機,如何快速的完成虛擬機從生成、維護、到銷毀的生命周期管理,這時候往往需要一個管理平臺。管理平臺可以使用開源產(chǎn)品,比如oVirt,OpenStack等等,也可以自己開發(fā)。
第三點是與業(yè)務(wù)的緊密結(jié)合,***是虛擬機生成的時候,游戲程序也能跑起來,這個有兩種解決辦法,一種是針對不同游戲制作不同的專用鏡像,這樣當(dāng)虛擬機生成的時候,游戲程序就在里面,但是這種方案在游戲頻繁發(fā)布版本的時候比較被動,因為每次發(fā)布版本都要更新鏡像。另外一種辦法是,使用比較通用的鏡像,在虛擬機生成的時候,將游戲程序和配置文件塞進虛擬機,當(dāng)虛擬機生成啟動后,自動完成配置。
第四點是要做好監(jiān)控報警,應(yīng)急響應(yīng)。任何事物都有兩面性,搞虛擬化之后,當(dāng)出現(xiàn)故障的時候,影響面要大很多。一款游戲,原來在物理機上的時候,一臺物理機故障,影響最多一個區(qū)組,當(dāng)實施了虛擬化之后,一臺宿主機故障,影響的是好幾個游戲區(qū)組,這就要求我們做好應(yīng)急響應(yīng)和監(jiān)控報警,早點發(fā)現(xiàn)并解決問題,甚至當(dāng)問題將要發(fā)生的時候就能提前預(yù)防。
實施過程中有那些虛擬化技術(shù)要點
KVM虛擬化詳細(xì)的技術(shù)在這里就不介紹了,只介紹一些在游戲虛擬化中的注意點。在介紹之前先來看下游戲業(yè)務(wù)的壓力模型。
#p#
游戲業(yè)務(wù)的壓力模型
游戲業(yè)務(wù)主要分為兩類模型:
GS(Game Server)類:主要是CPU密集型,CPU、內(nèi)存、網(wǎng)絡(luò)消耗高,磁盤IO消耗低。
DB(數(shù)據(jù)庫)類:主要是IO密集型,CPU、內(nèi)存消耗低,網(wǎng)絡(luò)、磁盤IO消耗高。
游戲業(yè)務(wù)的IO還有兩個特點:
網(wǎng)絡(luò)IO是小包,我們更關(guān)注發(fā)包率pps
磁盤IO更多是隨機小塊寫,我們更關(guān)注IOPS
游戲虛擬化中CPU技術(shù)要點
在游戲虛擬化中,我最喜歡的是CPU技術(shù)是CPU綁定,CPU綁定是一個非常神奇的技術(shù),最神奇的地方就是可以在線去做,在實戰(zhàn)中解決多次解決了性能問題。
一個CPU綁定的案例
當(dāng)時有一款游戲,已經(jīng)虛擬化了好幾個月了,一直很穩(wěn)定,有一個周末,游戲搞活動,玩家激增,有玩家有反饋游戲有玩游戲卡的情況。我登錄宿主機一看,發(fā)現(xiàn)宿主機部分CPU利用率非常高,宿主機是32核,前面幾個核CPU利用率已經(jīng)90%以上,但是后面幾個核壓力比較低,只有30-40%,我立即做了一個在線的CPU綁定,人工將CPU利用率拉平,解決了這個問題。
CPUhost-passthrough技術(shù)
CPU host-passthrough技術(shù)主要是將物理CPU的特性全部傳給虛擬CPU,根據(jù)應(yīng)用的不同,對CPU的性能提升也不同。另外還有一個好處,就是在虛擬機中可以看到和物理機一模一樣品牌型號的CPU,對于一些公有云來說,用戶體驗比較好。但是使用CPUhost-passthrough技術(shù)也要注意,這個技術(shù)不支持在不同型號CPU的宿主機之間在線遷移虛擬機。
游戲虛擬化中內(nèi)存技術(shù)要點
KSM相同內(nèi)存頁合并,或者叫內(nèi)存壓縮技術(shù),游戲虛擬化的時候一般建議關(guān)掉。為什么呢?因為游戲業(yè)務(wù)是高壓力應(yīng)用,對CPU、內(nèi)存的壓力非常高,一方面KSM不停在掃描內(nèi)存,會消耗CPU資源,另外一方面,分給游戲虛擬機的內(nèi)存,我們希望是分給多少,能利用多少,打開KSM就是為了內(nèi)存超用,如果真的超用了,當(dāng)游戲壓力大的時候,就會出現(xiàn)內(nèi)存不夠用的情況,這個使用就會有大量的SWAP交互,嚴(yán)重影響虛擬機的性能,影響玩家的游戲體驗。
關(guān)于虛擬機時間漂移
所以的虛擬機,不光是KVM,包括VMWare,XEN,HyperV,都有一個問題,就是因為虛擬機的時鐘是模擬出來的,一般虛擬機的走時要比物理機快一些。當(dāng)然,因為虛擬化的流行,這個問題在***的操作系統(tǒng)上優(yōu)化的越來越好。一般在生成環(huán)境,所有的虛擬機建議都配置精確時鐘和NTP,以保證走時準(zhǔn)確。有些游戲,對時間精度要求非常高,更要注意虛擬機時間的配置。
關(guān)于磁盤
一般虛擬機磁盤鏡像格式建議是qcow2或者lvm,因為這兩種格式有個共同的特定,就是可以動態(tài)的擴容,快照,并且支持精簡模式,使用管理起來非常方便。
磁盤的驅(qū)動VirtIO是標(biāo)配,VirtIO是一種半虛擬化的驅(qū)動,可以跳過用戶空間的虛擬化層,大大提高通訊效率。
磁盤緩存方式,常見的有四種,writeback,writethrough,none,unsafe,實際上是在虛擬化層和宿主機的文件系統(tǒng)這一層,開不開cache的各種組合,現(xiàn)在CentOS系列上默認(rèn)是writeback模式,這種模式啟用了宿主機文件系統(tǒng)的緩存,性能會好很多。我們在生產(chǎn)環(huán)境比較保守,一般在單機虛擬化的時候,使用writethrough方式,以數(shù)據(jù)安全為***位,在集群虛擬化,就是需要虛擬機遷移的場景,使用none方式,因為虛擬機要遷移,必須使用none方式。
關(guān)于網(wǎng)絡(luò)
見前段時間發(fā)布的《KVM虛擬化網(wǎng)絡(luò)優(yōu)化技術(shù)總結(jié)》已經(jīng)非常詳細(xì)的介紹了。
虛擬化的存儲方式
單機虛擬化
單機虛擬化的形式是一臺宿主機虛擬幾臺虛擬機,虛擬機的計算、存儲、網(wǎng)絡(luò)都在這臺宿主機內(nèi),是一種非常靈活的虛擬化方式,他不對原有的環(huán)境做任何改變,一臺宿主機,放到機房,虛擬化就搞起來了。
商業(yè)存儲集群
這種虛擬化方式由商業(yè)存儲和若干計算節(jié)點組成,虛擬機鏡像在商業(yè)存儲上,虛擬機使用計算節(jié)點的計算、內(nèi)存、網(wǎng)絡(luò)資源。因為有了共享存儲,就可以做虛擬機的在線遷移,配置虛擬機搞可用,配置計算資源的動態(tài)平衡。
關(guān)于商業(yè)存儲的選擇
目前常見的存儲分為文件存儲和塊存儲,快存儲又分為ISCSI,F(xiàn)C。不管是那種存儲,一般建議生產(chǎn)環(huán)境都是雙控制器,一般支持雙控制的存儲,從軟件到硬件都是雙冗余的,沒有單點故障。
另外,NFS和ISCSI一直有爭論,這個看自己對那種技術(shù)更熟悉,更喜歡。
FC的存儲成本比較高,但是性能也***,我個人喜歡ISCSI存儲,性價比高,性能基本也能滿足自己的要求。
總的來說,存儲的選擇需要考慮以下三點:
業(yè)務(wù)性能要求
預(yù)算
自己對技術(shù)的熟悉程度
#p#
分布式文件系統(tǒng)
這種方式其實是集群虛擬化的一個變種,就是用普通的pc server替換商業(yè)存儲,這種方式的好處是可以規(guī)模做的非常大,并可以動態(tài)擴展,一般公有云都是這樣的架構(gòu)。
三種存儲方式在游戲虛擬化中的應(yīng)用場景
單機虛擬化
壓力比較高,虛擬機比例比較低的游戲
一個機房虛擬機比較少的情況
主要是端游
集群虛擬化
壓力中低等,虛擬化比例在1:7以上的游戲
虛擬機數(shù)量多,強調(diào)快速部署,強調(diào)高可用的游戲
主要是手游頁游
分布式文件系統(tǒng)虛擬化
總體磁盤IO 1000iops以下
和商業(yè)集群存儲組合使用
主要是gs類的游戲服務(wù)器
另外,SSD在虛擬化存儲中使用越來越多,SSD和軟件結(jié)合的軟件定義存儲方式也越來越熱,以后有時間,給大家介紹一些相關(guān)的案例。
虛擬機資源限制
一般在生產(chǎn)環(huán)境,需要給虛擬機做資源限制,因為我們不希望一臺虛擬機消耗的資源過多,造成其他虛擬機餓死,虛擬機的資源限制主要是通過CGroup去做,CGroup可以配置的選項非常多,也非常靈活,就是配置起來稍微復(fù)雜一些。
Libvirt在CGroup上包了一層,通過修改虛擬機的xml文件,就可以完成對虛擬機的資源限制,通過Libvirt限制虛擬機的詳細(xì)介紹,請參考我的博客文檔,介紹的比較詳細(xì):
http://xiaoli110.blog.51cto.com/1724/1070201
虛擬化運維中的監(jiān)控、報警、災(zāi)備及應(yīng)急響應(yīng)要點是什么
監(jiān)控報警
硬件故障報警,我現(xiàn)在主要是使用帶外管理卡報警,新一代服務(wù)器,帶外管理卡監(jiān)控已經(jīng)非常完善,CPU 、內(nèi)存、磁盤、網(wǎng)卡、風(fēng)扇、電源任何硬件故障都會報警,通過郵件,或者寫腳本和自己的監(jiān)控平臺結(jié)合,可以很好的解決硬件報警的問題。
CPU方面,建議每個核的CPU利用率也監(jiān)控起來,經(jīng)常會碰到一直情況,就是整體的CPU利用率不高,可能只有20-30%,但是有一兩個核已經(jīng)100%了,這時候其實已經(jīng)碰到壓力瓶頸了,但是通過整體的CPU利用率是發(fā)現(xiàn)不了的。
內(nèi)存方面,swap利用情況建議也監(jiān)控起來,作為虛擬化來說,一般不希望宿主機使用swap分區(qū),所以swap的使用要監(jiān)控起來,方便出問題的時候排查,如果有大量的swap使用,應(yīng)該設(shè)置報警,肯定是碰到性能問題了。
磁盤、網(wǎng)絡(luò)方面,虛擬化磁盤、網(wǎng)絡(luò)是兩個難點,一般在上線之前,應(yīng)對其性能進行壓力測試,得到極限數(shù)據(jù),然后根據(jù)極限數(shù)據(jù)設(shè)置報警閥值。
災(zāi)備及應(yīng)急響應(yīng)
虛擬化的災(zāi)備有兩種思路,應(yīng)用層災(zāi)備及虛擬化層災(zāi)備,一般建議在應(yīng)用層災(zāi)備。虛擬化層災(zāi)備的手段是多份的鏡像復(fù)制及快照,這個往往要消耗大量的資源,多份復(fù)雜是以犧牲幾倍的磁盤空間為代價,快照是以犧牲性能為代價。往往應(yīng)用層做了很少的改動,虛擬化層是不能感知的,只是是全部備份,或者快照。
但是在應(yīng)用層災(zāi)備就簡單很多,只需要備份改動的部分,消耗的資源很少,而且速度很快。一般我們在生成環(huán)境的做法是,備份虛擬機的xml文件,當(dāng)故障發(fā)生時,提供一臺配置一模一樣的虛擬機,如果有需要mac地址也保持一致,然后交給業(yè)務(wù)方進行恢復(fù)。
災(zāi)備還要注意,定期演練非常重要,一方面是驗證自己的災(zāi)備幾種,一方面也是讓參與的人能熟悉災(zāi)備過程,這樣當(dāng)發(fā)生問題的時候,就可以很快的恢復(fù)業(yè)務(wù)。
軟硬件選型
軟件方面,當(dāng)然是穩(wěn)定版本,但是在穩(wěn)定版本的基礎(chǔ)上,內(nèi)核版本越高越好,為什么呢?因為內(nèi)核版本越高,對CPU的上下文切換和中斷優(yōu)化的越好,越有利于提高宿主機轉(zhuǎn)化率。Windows系統(tǒng)也一樣,Windows虛擬機建議盡量使用比較新的版本。
硬件方面越強悍越好,內(nèi)存越大越好,硬件越強悍,可以虛擬的虛擬機越多,從長時間綜合看,肯定是節(jié)省成本的。另外,一臺宿主機,使用上一段時間,我們往往發(fā)現(xiàn)內(nèi)存是瓶頸點,所有一開始的時候,盡量內(nèi)存配置點一點,可以避免隨后的內(nèi)存瓶頸。