基于英特尔平台打造高性能游戏云

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。

 

总结

  • 英特尔提供各种课程和社区, 帮助大家学习当前多核并行技术, 讨论未来的技术发展方向;
  • 英特尔提供一整套系统的软件工具, 更好的帮助工程师进行代码分析, 热点跟踪, 性能评估,最终制定优化方案;
  • 性能调优是一项系统工程,  从上层设计到底层微代码都需要综合分析面面俱到,  永无止境…