2020年是5G落地和发展的一年,也是信创产业十分关键的一年。在信息化应用创新的道路上,万物智能可谓必经之路,其不仅能够推动产业升级转型,还能提升各家企业服务效率,为应用创新注入源动力。但是智能化路径却并不是那么容易走通的,尤其是在算力层面。智能升级不仅依赖于网络和算法,还依赖于算力。网络从4G升级到5G,可以迅速提升接入设备数量和连接速度,降低时延,但是算力升级却并不容易。企业整体业务架构在智能化过程时,为了解决算力难题往往要大费周章。而且即便迁移到更强的算力平台,如果不能及时将业务架构与新的算力平台进行匹配优化,最终算力提升效果也很难达到理想状态。

由此可见,想要在信创过程中实现突破,便需要在迁移时找到合理的方法,并及时进行合理的应用调优,方能真正的实现高效智能化。在7月11日,华为在全国18城的鲲鹏创新中心举办了开发者创享日系列沙龙活动,各大沙龙的主题都瞄准了应用代码迁移与性能调优。在全国信创产业的核心地区之一,上海站的活动中显得格外惹人注目。此次活动中,来自华为的鲲鹏计算专家对于迁移过程中的技术路径和不同编程语言的迁移难题进行了深入解读,同时针对迁移过程中的软硬件性能调优及案例进行了详细演示。帮助更多开发者体验到鲲鹏架构迁移的独特优势。

信创产业推进,迁移也有捷径

为加快推进行业信创建设,金融、能源、电力、电信、航空航天、交通、医疗、教育等八个重点领域成为了信创试点领域,而上海也被确定为金融系统信创试点城市。上海的金融产业发达程度本就冠绝全球,而在金融系统信创方面自然也不能落后。

作为信创业务的推动力之一,华为在上海建设鲲鹏生态建设中心,对双方而言都是一种帮助。首先,上海被打造国际经济、金融、贸易、航运和科技创新五个中心,有利于鲲鹏技术的实践落地;第二上海是国际化大都市,政府及交通、教育、医疗等重点行业的信息化都走在全国前列,人才济济更能帮助鲲鹏生态的建设;第三,上海作为长三角一体化发展的龙头,其未来的发展前景不可限量。综上来看,华为在上海建立鲲鹏创新中心,能够打造出面向长三角、国家重点领域及海外复制推广的成功案例,同时也能推动上海的信创产业稳步提升。

软件迁移路径概述

产业提升离不开算力的提升,而算力升级便需要进行软件迁移。相信大多数开发者都理解程序的执行过程。计算机由软硬件组成,底层通常由晶体管和物理材料构成微架构,上层是应用程序、算法等二进制机器码,而中间一层则便是指令集架构。但问题在于,在不同的平台上,指令集是存在明显差距的。以x86平台上编译生成的应用程序在鲲鹏平台中运行时,必然要重新编译,也就是要执行软件迁移甚至是重构的过程。

 图片3.png

软件迁移的过程主要包含了以下五个关键步骤:

图片4.png

迁移准备:主要是进行软硬件信息的收集,其中包括了用来进行x86服务器匹配硬件信息,操作系统、虚拟机、中间件、编译器、上层依赖的开源软件、商业软件、业务软件等软件栈信息。

迁移分析:自研软件需要注意语言类型差异,编译型语言需要重新编译之后才能运行在新环境上,解释型语言来则只需要更好虚拟机;开源软件可以直接使用下载在ARM上已经被编译好的安装包即可,不支持的话可以自行下载原码编译;商用软件可以通过联系厂商获取它对应 ARM 架构下软件版本,如果没有则可以寻找类似开源软件替换。

编译迁移:自研软件相关迁移如果以解释性语言为主,则应用代码不需要迁移,但是如果是 C/C++ 等编译性语言,需要重新进行编译;软件包迁移时,需要先要扫描该软件包是否存在依赖库或者依赖的可执行程序,同样C 语言写的是需要重新编译的,编译之后重新把软件包打包,迁移完成后则可以对整体功能进行验收,迁移到此告一段落。

性能调优:性能调优时首先要建立调优标准,针对当前组网环境和逻辑架构设计新的目标;然后对软件进行压力测试,同时要记住变化,分析压力测试下各种数据指标,对单一指标进行优化;然后继续压力测试,检验优化是否达到效果,及时固化或回退,循环该过程从而实现调优。

测试与认证:主要有功能方面、性能方面和长稳以及安全类内容,保障软件能够达到商用水准后,即可规模上线。然后便可以进行软件和系统到鲲鹏上做鲲鹏展翅认证,扩展应用的软件使用空间并加入鲲鹏生态。截止 6 月 5 日,累计有 809 家行业伙伴已经获得鲲鹏展翅论证。

图片5.png

 C/C++的迁移

由于向量差异,指令集差异以及向量寄存器差异的原因存在,编译型语言如C/C++/Go等语言,其所开发的程序从x86处理器迁移到鲲鹏处理器时,必须经过重新编译才能运行。从源码到程序的过程大体需要源码需要由编译器、汇编器翻译成机器指令,再通过链接器链接库函数生成机器语言程序。

 图片6.png

举例来看,在test.c 的源码文件迁移时,先要经过预处理,把代码里面以 # 号开头的代码片断编译为预处理文件,再经由编译生成汇编代码。经过汇编器生成目标文件也就是机器码,然后联接动态库或者静态库来最终生成可执行文件。

C/C++代码工程主要包括两类文件,编译构建脚本和C/C++源码。编译构建脚本来需要移植的主要是编译选项,如指定数据类型、生成代码特性、目标执行器架构、处理器硬件加速功能等;C/C++源码类文件需要移植的则包括了编译宏、编译器自带builtin函数、内联汇编以及SSE intrinsic函数。

图片7.png

编译构建脚本移植的流程大体如上所示,在获取源代码之后,选择所需的编译环境,安装编译器 gcc 等;根据源码的编译脚本生成 Makefile 文件,再用 Makefile 编译生成可持续文件;担任如果代码之中有依赖 x86 平台的 SO 库,那么这部分的依赖库是需要重新编译替换的;在编译完成之后进行安装部署,然后便可以进入到实际的系统中进行测试了。

C/C++源码类文件移植时需要注意迁移过程中年的各个移植项。比如编译宏移植时,gcc 编译器所自带的 x86 编译选项就是 x86_64,对应到鲲鹏平台上是aarch64,对编译宏下的代码需要机箱内对应的移植;SSE  Intrinsic函数移植时,会涉及到大量的向量化预算加速技术,如果有类似开源工程可以直接应用,能够节省很多力气。

适当性能调优,迁移事半功倍

图片8.png

 作为一个几十年从未变过架构,冯·诺依曼架构主要有四大调优方向,CPU及内存、磁盘、网卡以及应用。

CPU和内存的优化主要可以分为硬件优化和软件优化。硬件优化又可以分为硬加速和软加速,硬加速在加解密、解压缩、大数据运算和EC上进行了优化,软加速又分成单核加速和多核加速,单核在编译方面进行了优化,多核则主要是在NUMA-Aware亲和性优化。

图片9.png

软件优化主要集中在编译层面,优化主要涉及四个方面:指令流水布局的优化、内存布局的优化、循环优化、除法优化。JDK的优化主要是采用了JIT编译优化、GC内存回收管理优化提升内存,在JVM循环方面采用向量化、序列化技术,提升程序执行性能。

图片10.png

磁盘调优的有三种优化方向:文件预读,脏数据刷新,IO调度算法和选择。磁盘有一个磁盘缓冲区,读取调用时会先读到磁盘缓冲区,再读到操作系统和文件系统,最后到内存,关键路径就在文件系统中。经过调优后,CFQ,DeaDLine、NOOP等适合固态硬盘的场景都有三种数据刷新,如果磁盘预取可以充分利用磁盘带宽,因为使用过的数据可以很快会被使用,使用过的数据相邻的数据也可以很快被使用。

网卡调优主要是在收到网络请求时,其会带来一个包由网卡告知CPU并处理,如不能处理完再返回。然后推给网卡驱动,然后产生一个硬中断,其会占用大量CPU时间线,产生性能损耗。通过调整网卡中断聚合,在低时延和高吞吐取平衡点以实现调优。

 图片11.png

应用优化,鲲鹏平台的优势在于核数比较多,处理并发量比较高的程序有天然优势。但高并发并不容易处理,一旦并发增加,部分公共数据要加锁时,并发加锁会导致多个线程抢占一个锁,就容易出现性能损耗。此时便可以针对这种情况进行代码优化,实现无锁编程,或者把大锁编程小锁,实现高性能原子操作,不会触发上述情况,这三类处理方式均可实现性能提升。

图片12.png

总结来看,在性能调优的四个方面还有其他的一些小技巧,比如CPU和内存优化时,可以通过调整内存页大小,CPU预取,修改线程调度策略实现提升;磁盘优化方面,脏数据刷新、异步文件操作(libaio)以及文件系统参数调整都可以有一些效果;网卡可以利用网卡多队列、开启网卡TSO、开启网卡CSUM实现优化;应用层面则能够利用优化编译选项、文件缓存机制、缓存执行结果、NEON指令加速等让系统运行更加流畅。