InfoQ|这篇文章给你答案,为什么必须将代码从x86迁移到ARM( 二 )


对开源软件来说 , 因为社区发展已经比较成熟 , 迁移相对较为简单 , 通过基于鲲鹏的架构分支或者鲲鹏支持的软件包 , 自行安装即可 。 对于自研软件来讲 , 情况则较为复杂 , 如C、C++这类编译型软件 , 从指令集差异化出发 , 需要重新编译后才能完成迁移 , 而Java、Python这种解释型的语言 , 因为其虚拟机如JDK、PVM已经把上层的一些跟指令集相关的东西屏蔽掉了 , 平滑地迁移过去即可 。 对于商用软件而言 , 不会公开源码 , 如果需要迁移 , 就必须要联系厂家去编译一个鲲鹏的版本 , 并且完成一系列的适配 。
此外像运行环境、虚拟机、编译器和操作系统这些也是要进行替换 , 但是这些并非需要重新编译 , 因为在华为云鯤鹏论坛内有软件仓库 , 可以直接去软件仓库下载由鲲鹏官方所做的经过验证的版本 。
3.编译迁移:代码迁移&软件包迁移
编译型的语言 , 之所以迁移起来比较困难 , 原因就在于涉及到比较多的迁移点 , 下面将从代码和软件包两方面进行阐述 。
对于对指令集有依赖的代码来说 , 与x86架构相关的 , 都需要替换成ARM架构下的语言;像以Java、Python为代表的解释型语言 , 换一下JDK和PVM就行了 , 如果语言中调用了编译型语言 , 必须把这部分重新编译才可行 。 对于软件包来说 , 其迁移与Java、Python语言类似 , 即扫描出来里边的对编译型语言的依赖 , 把这一部分依赖进行替换即可 。
4.性能调优:性能指标测试&性能优化
经过前面几个步骤之后 , 软件迁移其实就基本完成了 , 之后要对性能进行调优 , 主要分为建立基准、压力测试、确定瓶颈、实施优化、确认效果五个步骤 。
首先需要建立调优基准 , 该基准根据当前的硬件配置、组网、测试模型来做综合评估 , 以建立合理的条有目标;其次在调优目标建立后 , 通过压测工具对软件或系统进行加压 , 在加压过程中暴露性能瓶颈 , 确定瓶颈之后对瓶颈进行优化;第四 , 注意在优化过程中要及时记录 , 因为优化并不一定是正向的 , 出现负向优化时需要及时回退;最后在优化措施实施完成后 , 需要重新启动压力测试工具以确认优化效果 。
5.测试与认证:压力测试&长稳测试&规模商用
调优结束之后 , 接下来就要把功能运力、长稳运力以及性能运力都跑一遍 , 达到一个商用的标准 , 就可以筹备上线了 。 此外也可以将软件和系统进行鲲鹏展翅认证 , 其可以扩展应用的软件使用空间并能够加入鲲鹏生态 。
不同语言的迁移注意事项实际上 , 像Java、Python、Perl这种跨平台的开发语言 , 它的迁移的技术难度相对来说是比较低的 , 主要是因为Java有一个JBM , Python中存在一个解释器 , 它们屏蔽了大部分的平台架构上的差异 。 与之相反 , C和C++的难度相对来说要高一些 , 原因是如内敛函数还有x86加速的一些指令 , 无法支持像微软这种闭源的开发架构 。
典型的如C/C++/Go语言 , 都属于编译型语言 。 编译型语言开发的程序在从x86处理器迁移到鲲鹏处理器时 , 必须经过重新编译才能运行 。 如下图所示 , 源码需要由编译器、汇编器翻译成机器指令 , 再通过链接器链接库函数才能生成机器语言程序 。
InfoQ|这篇文章给你答案,为什么必须将代码从x86迁移到ARM
文章图片
接下来就是C/C++代码的编译构建了 , 这个过程一共分为六步:
获取源码:通过github或第三方开源社区获取
准备编译环境:安装编译器gcc等
使用源码中的CMakeLists.txt或configure脚本生成makefile
执行makefile编译可执行程序
替换依赖库:重编译或替换依赖x86平台的so库
将可执行程序安装部署到生产或测试系统
既然是最为复杂的 , C/C++语言的迁移问题也是涉猎最广泛的 , 主要涉及到七类问题:


推荐阅读