随着国家对新基建部署的逐步深入,加大对新基建的投入,5G、大数据中心、人工智能、工业互联网作为新基建七大领域中的 IT 部分,对 IT 基础设施提出了更高的要求,算力一跃成为了新的生产力,去带动各行各业的数字化快速发展。而我国的计算生态却并不十分乐观,传统的计算基础设施所需的成本投入居高不下,芯片产品的竞争力也还不能完全适配市场需求。
传统的 x86 架构存在着功耗大、通用寄存器数量少、计算机硬件利用率低、寻址范围小等问题,随着摩尔定律的放缓,算力和性能陷入了发展瓶颈。有预测指出,到 2025 年全球的设备连接数可以达到 1000 亿,其中 90%的算力和 92%的数据都会集中在云数据中心,这是整体的未来趋势。虽然目前英特尔占据了主流地位,但随着智能手机与物联网的大规模爆发与使用,ARM 处理器在移动终端市场份额达到 90%以上。
基于 ARM 架构设计的鲲鹏,将提前对全球未来的算力架构进行布局。华为不仅在中国携手合作伙伴共建鲲鹏生态,更积极扩大鲲鹏生态影响力,为下一代计算机平台的实施标准而努力。
7 月 11 日,由华为鲲鹏举办的 19 城鲲鹏创新中心开发者创享日·江苏鲲鹏生态创新专场技术沙龙在线上如期与开发者们见面。在江苏场进行的线上分享中,江苏鲲鹏生态创新中心生态总监吴明华为江苏鲲鹏生态创新中心做出了介绍。
华为智能计算产品线刘坤、华为鲲鹏计算的软件工程师覃璐瑶分别就鲲鹏软件迁移中 C/C++代码迁移以及 Maven 软件仓构建相关的知识点进行了详细讲解,帮助开发者及合作伙伴迅速定位软件迁移存在的坑点、难点及破局之道。
本次线上活动分享伊始,华为智能计算产品线的刘坤和线上的朋友们分享了鲲鹏软件迁移原因和 C/C++代码的迁移。
软件迁移的原因是什么?
众所周知,计算机是由软件和硬件组成的,要执行软件层的应用程序,就需要底层 CPU 支持由汇编器形成二进制的机器码(由指令和数据组成)去运行。因此需要底层计算平台能够支持该 CPU 的指令,对于不同的处理器而言,它们能够支撑的指令也大不相同,这也是 x86 和鲲鹏编译的区别之处。
以一个简单的例子来说明鲲鹏处理器和 X86 处理器的差异。如下图所示,左边的程序代码中的 c=a+b,在通过我们的编译器编译生成汇编指令之后,在 x86 平台上生成的汇编指令是通过三个 mow 指令加一个 add 指令来完成 c=a+b 这个过程。而对于鲲鹏处理器,我们是通过两个 ldr 指令将内存的数据,放入到寄存器当中;再通过 add 指令,将两个寄存器里的数据进行相加;最后通过一条 str 指令,将结果储存到内存中。在整个过程存在三处差异,首先是使用的指令不同;其次是指令的长度不同,x86 上是变长的指令,有 24 位与 16 位,而鲲鹏处理器下是定长的 32 位指令;最后是使用的寄存器不同。由于差异颇多,所以 x86 上编译的应用程序无法直接在鲲鹏处理器运行,需要进行重新编译。
软件迁移五步骤
接下来我们具体看一下每个步骤的主要工作:
迁移准备
迁移准备期间,主要是收集硬件和软件信息。硬件方面的信息主要是收集芯片和服务器的型号,软件信息主要包括操作系统,包括中间件使用的编译器,以及上层的一些业务软件、自研软件、开源软件,或者商业软件。以此为参考去申请远程的编译环境资源,帮助我们完成迁移。
迁移分析
如图所示,软件技术栈从底层往上,分别是芯片、OS,再到上层使用的 GCC 编译器版本,业务软件。这里主要分为两大块,一类是业务软件的分析,另一类是运行环境的分析。
业务软件主要可以分为开源软件、自研软件和商用软件。开源软件可以通过获取开源的代码进行重新编译,或者获取对应的 ARM64 鲲鹏处理器能够支持的软件包进行安装。自研软件可以依据编译型语言与解释性语言有所不同,如果是编译型语言如 C/C++/GO 语言,需要进行重新编译才能完成迁移。而对于 Java/Python 这样的解释型语言,因为其虚拟机已经将相关内容屏蔽,只需替换相应的虚拟机版本,即可进行平滑迁移。对于商用软件,我们可以获取支持鲲鹏处理器的商用软件版本,如果无法获取相应软件版本,我们可以通过一些其他软件或开源软件来进行替换。
对运行环境而言,像虚拟机、编译器和操作系统都是需要进行替换的,华为云鯤鹏论坛内的软件仓库中可下载经由鲲鹏官方的验证版本。
编译迁移
编译是整个迁移的核心过程。编译主要分为两类,第一类是代码的迁移,第二类是软件包的迁移。
代码迁移可分为编译型语言与解释型语言。对于编译型语言来说,修改点主要涉及代码的修改、编译脚本、编译选项的修改,包括内联汇编的修改,还有一些 SSE 指令等,很大程度上需进行重写。对于 Java、Python 为代表的解释型语言主,主要是相应虚拟机版本的安装,无需改动代码。但如果语言中调用了编译型语言,或者依赖了 x86 的依赖库,则必须对这一部分进行重新编译。
而对于软件包迁移,首先需要扫描该软件包是否存在依赖库或者依赖的可执行程序,这些库和可执行程序如果是用 C 语言完成,则需重新进行编译。编译之后需重新把软件包打包。
性能调优
经过以上几个步骤后,软件迁移已经基本完成。便可进行性能调优,调优主要分为建立基准 、压力测试 、确定瓶颈、 实施优化、 确认效果五个步骤。
建立调优基准上第一步,该基准根据当前的硬件配置、组网、测试模型来做综合评估,以建立合理的条有目标;在调优目标建立后,通过压测工具对软件或系统进行加压,在加压过程中暴露性能瓶颈,在确定瓶颈之后对瓶颈进行优化;第四,注意在优化过程中要及时记录,因为优化并不一定是正向的,出现负向优化时需要及时回退;最后在优化措施实施完成后,需要重新启动压力测试工具以确认优化效果。
调优之后,需要确认一下当前的效果是不是达到预期的效果指标。如果没有达到,需要再迭代整个过程,不断的进行调优,优化软件性能。
测试与认证
在性能调优环节结束后,还需要做一些压力和长稳测试,使软件能够达到商用目标,最终实现规模上线。此外也可以进行鯤鹏展翅认证,一起加入到鲲鹏生态中。
典型迁移场景
C/C++代码迁移
C/C++代码工程主要包括两类文件:编译构建脚本和源码,编译构建脚本的移植项主要包括编译选项的移植(指定数据类型、生成代码特性、目标执行器架构、处理器硬件加速功能等),具体需要参照编译器的官方文档进行相应调整,比如 x86 平台下的-m64 编译选项的主要功能是将应用程序编译为 64 位,对应到鲲鹏平台上则是-mabi=lp64;源码的移植项主要包括编译宏移植(用户自定义宏移植、编译器自定义宏移植)、编译器自带 builtin 函数移植、内联汇编移植、SSE intrinsic 函数移植(MMX/SSE 类函数移植、AVX 函数移植)。
为方便迁移,华为提供了 Porting Advisor 迁移工具,并针对了 C/C++代码进行扫描分析,检查用户 C/C++代码中需移植修改的 MakeFile 编译文件、X86 汇编及 SSE intrinsic 函数,还可指导用户如何移植。
华为鲲鹏计算的软件工程师覃璐瑶为大家介绍了 Java/Python 运行过程中可能涉及的迁移改动点及处理方法、典型场景的迁移方法以及如何独立完成 Java/Python 代码的迁移。
Java 代码迁移
对于 Java 代码工程来说,如果不涉及底层依赖库,就无需对代码进行进一步修改,只需安装相应版本的 JDK 即可。鲲鹏上已经适配了 1.8 版本的 JDK,可以直接通过 yum 安装使用。如果存在 so 库的依赖,就需要对其进行重新编译或者使用 aarch64 的 so 库进行替换,并重新打包。
由于架构差异明显,为了保证程序的稳定运行,还需要对 JVM 的相关参数进行调整。具体表现在:
差异一:线程栈大小的 Xss 参数在 ARM 上默认值为 2M,在 X86 上为 1M,若 线程开的太多,需要使用 Xss 调整线程栈的大小,防止 OOM。
差异二:由于 ARM 和 X86 指令集的差异性,导致 JDK 的 JIT 编译存在差异。则可以通过设置参数 ReservedCodeCacheSize, 调整 CodeCache 大小。
为了便于迁移,华为提供了适用于鲲鹏的 Maven 库,将部分无法在鲲鹏上直接使用的依赖 x86 so 库的 jar 包,提前编译好放在鲲鹏 maven 仓内,就可直接使用。同时,还可通过 Dependency Advisor 分析扫描工具,简单直接的扫描出需要移植的 so 库。
Python 代码迁移
Python 的代码迁移与 Java 类似,也涉及到两个方面,一个是自身虚拟机的安装,一个是依赖的 so 库的迁移。
以依赖 C 模块的 Python 代码为例,其迁移过程如下:
使用Porting Advisor工具分析源码;
识别依赖SO库,C代码 ;
下载模块源码;
安装GCC 配置-fsigned-char选项 ;
执行setup.py自动完成模块编译 ;
完成aarch64版本SO库的替换 ;
编译的模块安装到site-packages 目录下,供其他Python源码引用。
软件包迁移
常见的 Linux 发行版主要分为两类:类 RedHat 系列和类 Debian 系列。RedHat 系统中,软件包的格式是 rpm;Debian 系统中,软件包的格式是 deb。RedHat 系统提供了 rpm 命令来安装、卸载和升级 rpm 软件包;Debian 系统提供了 dpkg 命令来安装、卸载、升级 deb 软件包。
而以 rpm 为例,一个应用程序包括二进制文件、库文件、配置文件、帮助文件等。为了将 x86 的 rpm 文件迁移到鲲鹏中来,我们需要将 so 库和二进制文件重新进行编译打包。
鲲鹏平台的 rpm 文件主要有以下 5 个获取渠道,如图所示。
x86 的 rpm 包重构成鲲鹏 rpm 包的流程如图所示。
总结
对于开发者来说,迁移是个人技能的一部分;对于互联网企业来说,迁移是助企业融入到下一代计算平台的必要经历。越早入局,就越能提前占据主导地位,成为新时代的攻坚者。从处理器到操作系统,鲲鹏持续不断的发力,作为先行者,越来越多的伙伴加入进来,其生态力量也愈发强大。
此次线下沙龙的成功举办,意味着鲲鹏计算体系生态圈的进一步扩大。多年来,华为始终秉持着“硬件开放、软件开源、使能伙伴”的初心,以行业聚合应用,以区域整合产业,以联盟孵化标准。未来,华为鲲鹏也将继续与更多开发者前行,持续构建开放、合作、共赢的生态,更好地服务各个行业。
评论