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