InfoQ|为什么必须将代码从x86迁移到ARM,这篇文章给你答案( 二 )
2. 迁移分析:软件栈分析 & 编程语言分析
这一过程要做的就是对收集到的信息和软件栈做初步分析 , 目的是判断是否真正需要迁移 , 评估迁移的工作量 。
【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 处理器迁移到鲲鹏处理器时 , 必须经过重新编译才能运行 。 如下图所示 , 源码需要由编译器、汇编器翻译成机器指令 , 再通过链接器链接库函数才能生成机器语言程序 。
本文插图
接下来就是 C/C++ 代码的编译构建了 , 这个过程一共分为六步:
