閱讀658 返回首頁    go 阿裏雲 go 技術社區[雲棲]


基於英特爾平台打造高性能遊戲雲

3月8日,2017遊戲行業全球同服和安全攻防技術沙龍在上海舉行,英特爾技術人魏彬帶來題為“基於英特爾平台打造高性能遊戲雲”的演講。本文首先從最新英特爾平台技術簡介開始,接著講解了性能優化方法論,著重分析了遊戲優化方案,包括TBB Malloc、ICC優化、微架構NUMA優化和High-Bin Xeon的優勢,最後進行了簡要總結。一起來了解下!

直播視頻回放

以下是精彩內容整理:

最新英特爾平台技術簡介

Tick-Tock Development Model

32d2acd9d9c7905f7490b7192f56398d1400ad6d

Tick-Tock Development Model告訴大家,英特爾在每年沒有一個產品迭代是怎麼進行的,像鍾擺一樣,我們每一次除了在製程上提升以外,還要進行架構上的提升。目前已經到了最新一代 skylake產品。

Purley: Biggest Platform Advancement Since Nehalem

e603eb27057e019d0a2f326ec488d903f1e968cd

skylake可以強到什麼地步呢?首先對於memory bandwidth有1.5倍的提升,支持6個memory channels,有些應用場景需要大的內存帶寬,比如需要更高的主頻,需要新指令的支持(AVX-512),skylake在一次運算一次SQL時可以做512位運算,效率會得到極大提升,怎樣能將它用好需要軟件方麵的配合。後麵還有對於光的支持,我們有最新的光互聯技術,skylake裏將會integrated一個FPGA芯片,阿裏雲後續也會跟我們在FPGA上有合作。

e7d21ae00f184d21d38a34207975914c9b188b96

對比下可以看到,大部分使用的虛擬主機、遊戲主機上broadwell一代,最多一個socket可以支持到24個核,到skylake一代,我們將核心數又提高到最多支持28個核,兩個socket服務器可以有56個物理核,這也會導致編程上的問題,那麼,有了這麼多核,大家如何能夠更好的利用呢?

我們與阿裏雲有緊密的合作,幫助阿裏雲優化很多軟件,有些客戶反饋一些性能上的問題後,我們會幫助解決。很多問題與阿裏雲本身沒有很大關係,更多層次上發生在應用的編寫者怎樣通過編程手段更好的利用核心,比如你寫了一個單線程的應用,它死用一個核心,該核心資源如果到了百分百後對你的業務來講,沒有辦法再進一步提升性能,你所能達到的是如何能夠更高頻率的使用CPU達到高性能,但其實在某些層麵上,我們可以做很多軟件的優化,將單線程業務做多線程的處理,這樣能夠充分發揮多核處理能力,業務自然就沒有問題。

 

性能優化方法論

8611fb391e3c89f93e440d6148c39eae8549eb3c

阿裏雲底層使用英特爾CPU,在使用過程中我們始終強調性能如何進一步提升,很多情況下取決於編程模式,我們在此積累了很多方法論,無論是AI相關、web相關還是search相關,或者遊戲相關,很重要的是要做好性能的監控和分析,英特爾會有很多工具幫助你實現,例如vTune可以讓你看到整個最熱點函數發生在哪一行、代碼是在哪一段、該段代碼消耗了多少時間的CPU等都會表示出來,這樣我們就可以針對這一段代碼展開分析,我們能夠提供服務包括幫助查看熱點在哪裏、幫助分析熱點到底是因為什麼導致的、怎麼樣去優化等,比如大家在做memory拷貝,memory set函數調用的非常多,我們就會查看是否有用到英特爾最新指令,如果沒有用到,我們會給出很多的建議和方案。圖中閉環非常重要,等我們將性能調整完畢後,還要做類似的壓測,然後再看你的熱點是否有變化。

應用在英特爾平台性能優化方法論

c8f9a2d848ccdbfde5e6a6da571b4feee488d081

我們對整個方法論進行了總結,可以應用在不同領域,具體如下:

  • 常態化性能監測和分析:我們最好在業務上線之前能夠對自己的code進行scan,或做小規模的壓測,發現瓶頸在哪裏並解決它,然後再上線,所以我們要將這種事情做成常態化,常態化有應用層次的優化監控,甚至於在微指令架構層做更深的優化,因為很多時候在應用層看不到很多熱點,但在微架構層可以看到很多問題,比如cache miss;
  • 應用程序性能瓶頸分析:我們有很多分析工具,比如vtune、inspector等幫助檢測內存和線程等等;
  • 基於IA平台的計算性能優化:可以采用ICC重新編譯,它會自動幫助將代碼中能優化的部分優化,還也有一些數學運算庫等等。

 

遊戲優化案例分析

我們經常會遇到一些性能問題概述如下:

1.         有些後台遊戲服務, 瓶頸主要來自於內存相關操作,例如 malloc 和memcpy, 當一個場景中有太多玩家進行操作時,CPU 利用率將達到最高值,malloc 操作將占用超過 50% 的CPU資源。

2.         內存分配和相關操作(memcpy…etc)被頻繁的調用,占用的大量的時間,產生碎片,所以應用運行了一段時間後性能逐步降低。

3.         對於malloc問題,嚐試用tcmalloc來解決,但結果也不是很有效

5cc3d31e490796208548011bbd99f54b7270c23b

圖為vTune一個界麵,它可以告訴你這個函數大概占了多少CPU時間,可以看到多進程部署, 非常多的進程運行在一個物理機上;進程拉起階段,單個進程占用了一個物理核的100%的資源,但是在運行時隻占10%;熱點函數是FmallocAnsi::malloc, 基於glibc來實現的。我們可以針對此進行性能優化。

解決方案1-TBB Malloc

60bd99ca3dacc7f2130995c8efe815cee4c77898

使用TBB Malloc替換了FMallocAnsi ( 建立在glibc  malloc/realloc/free基礎上的較為複雜封裝), 初步測試,提升較為明顯:

1.         進程拉起時間加快了0.1s,有不到10%的時間提升 ;

2.         CPU測試,粗略測試,每個單局5%的提升(一台物理機64個單局);

3.         拉起內存增大4M,運行時內存動態增大,正常單局可能有<10M的內存增加,目前在可容忍範圍內。

解決方案2–英特爾編譯器(ICC)優化

9d6c81bfe60dc8e6107e18bf93fea55b02cc454e

模擬在線的方式測試CPU性能,重新編譯應用就可以達到比較好的性能,使CPU利用率降低了20%,讓你得到更多的資源做其他事情。

解決方案3–微架構NUMA優化

f082a9fd4a2086918f84ea4e46984a0a85c0ef76

綁定task到固定的CPU物理核,減少遠端內存訪問,減少Cache Miss:

  • Taskset for Task1
  • Pthread Affinity API(pthread_setaffinity_np) for Task2 threads

解決方案4High-Bin Xeon的優勢

6bb48316fb1a0135f2c6b218da655fcd48045b7f

在有些極端情況下,代碼很難改,可以選擇高性能CPU。

 

總結

  • 英特爾提供各種課程和社區, 幫助大家學習當前多核並行技術, 討論未來的技術發展方向;
  • 英特爾提供一整套係統的軟件工具, 更好的幫助工程師進行代碼分析, 熱點跟蹤, 性能評估,最終製定優化方案;
  • 性能調優是一項係統工程,  從上層設計到底層微代碼都需要綜合分析麵麵俱到,  永無止境…

 

最後更新:2017-04-19 09:30:42

  上一篇:go 各類商會協會單位類織夢模板(帶手機端)
  下一篇:go 業務運維如何做?Docker集群、監控來幫忙