基於英特爾平台打造高性能遊戲雲
3月8日,2017遊戲行業全球同服和安全攻防技術沙龍在上海舉行,英特爾技術人魏彬帶來題為“基於英特爾平台打造高性能遊戲雲”的演講。本文首先從最新英特爾平台技術簡介開始,接著講解了性能優化方法論,著重分析了遊戲優化方案,包括TBB Malloc、ICC優化、微架構NUMA優化和High-Bin Xeon的優勢,最後進行了簡要總結。一起來了解下!
以下是精彩內容整理:
最新英特爾平台技術簡介
Tick-Tock Development Model
Tick-Tock Development Model告訴大家,英特爾在每年沒有一個產品迭代是怎麼進行的,像鍾擺一樣,我們每一次除了在製程上提升以外,還要進行架構上的提升。目前已經到了最新一代 skylake產品。
Purley: Biggest Platform Advancement Since Nehalem
skylake可以強到什麼地步呢?首先對於memory bandwidth有1.5倍的提升,支持6個memory channels,有些應用場景需要大的內存帶寬,比如需要更高的主頻,需要新指令的支持(AVX-512),skylake在一次運算一次SQL時可以做512位運算,效率會得到極大提升,怎樣能將它用好需要軟件方麵的配合。後麵還有對於光的支持,我們有最新的光互聯技術,skylake裏將會integrated一個FPGA芯片,阿裏雲後續也會跟我們在FPGA上有合作。
對比下可以看到,大部分使用的虛擬主機、遊戲主機上broadwell一代,最多一個socket可以支持到24個核,到skylake一代,我們將核心數又提高到最多支持28個核,兩個socket服務器可以有56個物理核,這也會導致編程上的問題,那麼,有了這麼多核,大家如何能夠更好的利用呢?
我們與阿裏雲有緊密的合作,幫助阿裏雲優化很多軟件,有些客戶反饋一些性能上的問題後,我們會幫助解決。很多問題與阿裏雲本身沒有很大關係,更多層次上發生在應用的編寫者怎樣通過編程手段更好的利用核心,比如你寫了一個單線程的應用,它死用一個核心,該核心資源如果到了百分百後對你的業務來講,沒有辦法再進一步提升性能,你所能達到的是如何能夠更高頻率的使用CPU達到高性能,但其實在某些層麵上,我們可以做很多軟件的優化,將單線程業務做多線程的處理,這樣能夠充分發揮多核處理能力,業務自然就沒有問題。
性能優化方法論
阿裏雲底層使用英特爾CPU,在使用過程中我們始終強調性能如何進一步提升,很多情況下取決於編程模式,我們在此積累了很多方法論,無論是AI相關、web相關還是search相關,或者遊戲相關,很重要的是要做好性能的監控和分析,英特爾會有很多工具幫助你實現,例如vTune可以讓你看到整個最熱點函數發生在哪一行、代碼是在哪一段、該段代碼消耗了多少時間的CPU等都會表示出來,這樣我們就可以針對這一段代碼展開分析,我們能夠提供服務包括幫助查看熱點在哪裏、幫助分析熱點到底是因為什麼導致的、怎麼樣去優化等,比如大家在做memory拷貝,memory set函數調用的非常多,我們就會查看是否有用到英特爾最新指令,如果沒有用到,我們會給出很多的建議和方案。圖中閉環非常重要,等我們將性能調整完畢後,還要做類似的壓測,然後再看你的熱點是否有變化。
應用在英特爾平台性能優化方法論
我們對整個方法論進行了總結,可以應用在不同領域,具體如下:
- 常態化性能監測和分析:我們最好在業務上線之前能夠對自己的code進行scan,或做小規模的壓測,發現瓶頸在哪裏並解決它,然後再上線,所以我們要將這種事情做成常態化,常態化有應用層次的優化監控,甚至於在微指令架構層做更深的優化,因為很多時候在應用層看不到很多熱點,但在微架構層可以看到很多問題,比如cache miss;
- 應用程序性能瓶頸分析:我們有很多分析工具,比如vtune、inspector等幫助檢測內存和線程等等;
- 基於IA平台的計算性能優化:可以采用ICC重新編譯,它會自動幫助將代碼中能優化的部分優化,還也有一些數學運算庫等等。
遊戲優化案例分析
我們經常會遇到一些性能問題概述如下:
1. 有些後台遊戲服務, 瓶頸主要來自於內存相關操作,例如 malloc 和memcpy, 當一個場景中有太多玩家進行操作時,CPU 利用率將達到最高值,malloc 操作將占用超過 50% 的CPU資源。
2. 內存分配和相關操作(memcpy…etc)被頻繁的調用,占用的大量的時間,產生碎片,所以應用運行了一段時間後性能逐步降低。
3. 對於malloc問題,嚐試用tcmalloc來解決,但結果也不是很有效
圖為vTune一個界麵,它可以告訴你這個函數大概占了多少CPU時間,可以看到多進程部署, 非常多的進程運行在一個物理機上;進程拉起階段,單個進程占用了一個物理核的100%的資源,但是在運行時隻占10%;熱點函數是FmallocAnsi::malloc, 基於glibc來實現的。我們可以針對此進行性能優化。
解決方案1-TBB Malloc
使用TBB Malloc替換了FMallocAnsi ( 建立在glibc malloc/realloc/free基礎上的較為複雜封裝), 初步測試,提升較為明顯:
1. 進程拉起時間加快了0.1s,有不到10%的時間提升 ;
2. CPU測試,粗略測試,每個單局5%的提升(一台物理機64個單局);
3. 拉起內存增大4M,運行時內存動態增大,正常單局可能有<10M的內存增加,目前在可容忍範圍內。
解決方案2–英特爾編譯器(ICC)優化
模擬在線的方式測試CPU性能,重新編譯應用就可以達到比較好的性能,使CPU利用率降低了20%,讓你得到更多的資源做其他事情。
解決方案3–微架構NUMA優化
綁定task到固定的CPU物理核,減少遠端內存訪問,減少Cache Miss:
- Taskset for Task1
- Pthread Affinity API(pthread_setaffinity_np) for Task2 threads
解決方案4–High-Bin Xeon的優勢
在有些極端情況下,代碼很難改,可以選擇高性能CPU。
總結
- 英特爾提供各種課程和社區, 幫助大家學習當前多核並行技術, 討論未來的技術發展方向;
- 英特爾提供一整套係統的軟件工具, 更好的幫助工程師進行代碼分析, 熱點跟蹤, 性能評估,最終製定優化方案;
- 性能調優是一項係統工程, 從上層設計到底層微代碼都需要綜合分析麵麵俱到, 永無止境…
最後更新:2017-04-19 09:30:42