阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

上云实践:从 X86 到 ARM,跨越 CPU 架构鸿沟

  • 2021-03-18
  • 本文字数:3768 字

    阅读完需:约 12 分钟

上云实践:从X86到ARM,跨越CPU架构鸿沟

1、概述


随着 IT 技术的不断演进,公有云、专属云、混合云、云原生等相关技术概念层出不穷,云计算已经有了广泛应用,成为数字经济、政企数字化转型的新型基础设施。


在云计算时代,由于功耗低、高性能以及指令集的优势,越来越多的云厂商开始选择基于 ARM 体系来构建云服务。从 AWS 发布的 Graviton 2,到 Apple 的 M1 芯片,到中国电子云十年磨一剑的“PK 架构”,再到华为鲲鹏体系,ARM 体系成为了未来的趋势方向。


对于企业数字化转型来说,应用上云是必经之路。从狭义来说,上云是将运行在物理机上的应用系统搬迁到云上。从广义上看,上云会涉及到跨架构适配、虚拟化、容器化、云原生等一系列的技术升级和重构。


上云的不同阶段,所依赖的技术并不同。从左至右,应用对云的依存度也越来越高。


下文对几个阶段涉及到的技术做简单阐述。


  • 阶段 1:跨架构适配


传统应用大部分是基于 X86 架构来开发和运行。面对 ARM 架构越来越流行的今天,越来越多的云计算厂商开始围绕 ARM 架构构建云应用生态。并据此引发了大量的适配测试需求。X86 和 ARM 体系架构的差异对于应用有哪些影响?X86 应用向 ARM 体系迁移会碰到哪些技术难题?对于不同编程语言实现的应用来说,迁移的难度是否有区别?


本文将针对以上问题开展分析。


  • 阶段 2:虚拟化


计算虚拟化能力是云计算提供的核心能力。截至到今天,很多行业用户的上云还是停留在这个阶段。虚拟化的最大用途是使得应用与物理机器解耦,将资源池化,按需分配资源,并因此获得弹性伸缩和迁移能力。这个阶段的上云,往往会涉及到 P2V 和 V2V 这两种主要场景。前者是从物理机向虚拟机迁移(Physical to Virtual Migration)),后者是虚拟化的跨云迁移(Virtual Machine to Virtual Machine)。


  • 阶段 3:容器化


容器化是将应用程序及其所需的库、框架和配置文件打包在一起的过程,以便可以在各种计算环境中高效运行它。得益于 Docker 等技术的流行,应用容器化更进一步促进了应用的配置、依赖以及镜像的标准化,使得应用交付、运维等领域有极大的提升。这个阶段的上云,对于软件开发过程有一定的要求,需遵循相应的容器化规范。


  • 阶段 4:云原生


云原生时代的到来,是容器化后的必然阶段。通过 Kubernetes、devops、微服务等技术的不断发展,尤其是对有状态应用支撑能力的不断增强,云原生已然成为新一代应用开发的事实标准。


技术的发展有天才工程师的灵光一现,其背后同样也需要遵循客观自然规律。下文将从阶段 1 入手,尝试从底层技术进行解构,或许能帮助我们更清晰的看到本质。

2、跨越 CPU 架构


纵观计算机技术的发展史,软件系统是一个不断抽象,不断叠加的过程。操作系统的出现,解决的是单机硬件多样性的难题,为上层应用软件提供一致的底层运行环境。云计算的出现,解决的是分布式架构引入的多样性问题,为应用提供跨机器、跨地域的一致运行环境。


我们先从 CPU 指令集的差异对比开始。

2.1 CPU 指令集对比


在计算机体系结构的发展过程中,诞生了 CISC(复杂指令集)和 RISC(精简指令集)这两大流派,它们采用了不同的设计理念和方法,CISC 采用单条复杂指令完成特定复杂功能,提高了存储器访问效率;RISC 则采用多条精简短指令完成特定复杂功能,提高了处理器运行速度。基于这两类指令集,产生了两种主流的 CPU 架构:X86 架构,采用的是 CISC 复杂指令集,而 ARM 架构则采用了 RISC 精简指令集。


CISC 指令集指令系统庞大,指令数目、指令格式和寻址方式复杂,指令字长不固定,各种指令执行周期和访问频率相差很大,采用微指令码控制单元的设计。


RISC 指令集选取使用频率最高的精简指令,避免复杂指令,将指令数目、指令格式和寻址方式种类减少,指令长度固定,大多数的指令都可以在一个机器周期里完成。以控制逻辑为主,不用或者少用微指令码控制。

2.2 对应用迁移的影响


应用本质上是一种程序,程序在运行态是由一系列进程组成,而进程可以说是计算机科学最重要和最成功的概念之一。进程的运行依赖操作系统对 CPU、内存的调度和管理,操作系统保持跟踪进程运行所需的所有状态信息。比如寄存器、PC 计数器、逻辑单元 ALU 等。


综合来说,X86 和 ARM 属于不同的架构。X86 属于复杂指令集,而 ARM 属于精简指令集, X86 上的程序根本不可能毫无阻碍地就可以在 ARM 上使用,必须经过适配迁移。


从另外的角度来看,应用选择不同的编程语言,会有不同的跨架构能力。下面分析下主流的 C++和 Java 应用在不同架构下的差异表现。

2.3.1 C/C++语言


众所周知,C/C++程序是计算机系统级别最为成功的语言之一。业界存在大量的知名开源软件基于 C/C++构建,比如 Windows/Linux 操作系统自身,以及使用广泛的分布式存储系统 Ceph。


在 C/C++世界里,从源代码演变成运行中的进程,需要经历编译、汇编、链接、运行等一系列过程。

Step 1 编译


编译是将源代码经过处理,转变成汇编语言的过程。这一过程的关键工具是编译器。有了编译器的存在,现代编程语言(如 C++)的源代码一般能做到架构无关,通过不同平台编译器(如 GCC)的处理,可以得到不同体系结构下的汇编代码。


举例如下源代码:



在 X86 平台编译器编译后,得到汇编代码如下:


备注:以上 mov、push 等均为 X86 体系架构汇编指令。


在 ARM 平台编译后,得到汇编代码如下:


备注:以上 mov,STR,LDR 均为 ARM 架构汇编指令。


汇编指令的简单对比如下:


功能

X86指令

ARM指令

数据传输

MOV

MOV

算术加

ADD

ADD

算术减

SUB

SUB

比较指令

CMP

CMP


仅从常用指令集名称来看,两者比较相似,但实际大相径庭。举例说明,在 ARM 指令中,MOV 与 ADD 之间需要通过 STR 和 LDR 两条指令完成数据从内存往寄存器的加载,其原因是 ARM 算术指令只能运行在寄存器,而 X86 则无此限制。


其他差异本文不再一一分析。


由此可以看出,X86 和 ARM 架构的指令集差异很大,对于 C++语言来说,编译器帮我们搞定这些差异,但需要从源代码重新编译。

Step 2 汇编


汇编是将汇编代码转变成机器代码的过程。以上汇编代码在 X86 平台下,得到的机器代码如下:


备注:以上为局部截图。


而在 ARM 平台下,得到的机器代码会完全不同。

Step 3 链接


链接在 C++语言特有的处理机制,将 OS 里的链接库与程序进行链接的过程。这一过程的输出物即为可执行程序。最终的运行,对于 C++和 Java 来说,通常都有 Main 函数作为程序的运行入口(某些框架会对其进行封装,如 Java Spring 框架)。


综合以上,对于 C/C++开发的应用程序来说,向 ARM 架构迁移需要完成重新完成编译、汇编、链接的全过程,应用跨架构迁移的难度较大。

2.3.2 Java 语言


Java 语言在 Web 应用开发占据绝对的主导地位。Java 是基于虚拟机的语言,也是所谓提供跨平台运行能力的语言。Java 应用从源代码到运行,需经历编译、运行两个环节。

Step 1 编译


使用 javac 命令进行编译,通常得到 java 字节码文件,以.Class 后缀命名的文件。


以下面的代码为例。



X86 环境编译得到的字节码如下:


备注:以上为局部截图。


ARM 机器上编译,得到如下字节码:



经比较,会发现两者得到的字节码基本一致。

Step 2 执行


Java 体系为 X86 和 ARM 分别提供了不同的 JVM。在运行时,JVM 通过类加载器执行以上字节码文件。


备注:实际运行时,JVM 会将字节码转换成机器码来运行,这个过程暂且忽略不表。


综合来看,对于 Java 应用来说,X86 和 ARM 架构的差异完全由 JVM 层屏蔽,应用跨架构迁移的难度很小。


上文主要从 CPU 架构差异、编程语言差异的角度来分析对应用的影响。下面结合中国电子云的实际上云案例来做进一步的阐述。

3、蓝信上云实践


蓝信是中国电子云上运行的重量级应用之一,作为中国电子云“一云一端”的战略组成部分,提供安全可靠的企业消息通讯、视频会议和协同办公能力,在政企市场有着广泛的应用场景。

3.1 蓝信对中国电子云的适配过程


蓝信原生是构建在 X86 体系架构下的,针对中国电子云底层采用 PKS 架构,需要做整个系统的适配,主要工作体现以下几点:

a.针对体系架构改变的适配


代码级重新编译以适配 ARM 架构,由于目前流行的开发语言早已对 ARM 体系进行过适配(例如,golang,java,c/c++, python 等)这部分工作难度不大。

b.数据库的适配


数据库部分,蓝信需要从 MySQL 迁移到达梦数据库,由于达梦数据库对 MySQL 语句的良好支持,只有部分语法存在兼容性问题,仅需在数据层进行适配,业务层并不需要改动,整体适配可在一个月内完成,其中主要成本集中在适配后的全量功能测试上。

c.基础设施及中间件的适配


蓝信依赖的基础设施及中间件也需要适配,例如 etcd,k8s,redis,kafka,mongoDB 等,这部分工作由于大部分基础组件已经有了 ARM 版本,直接使用即可,极个别的组件,需要进行源码级的编译。

4、总结和思考


在当前数字产业大发展的背景下, 对 ARM 架构的关注必然会不断升温,各行业会出现大量应用从 X86 向 AMR 架构迁移,也催生了大量的应用跨架构适配测试需求。


通过前文的分析,我们可以得出如下结论:


  • X86 架构和 ARM 架构的确存在较大差异。两者在指令集、寄存器等方面均有很大的不同,但对于应用系统的移植来说,并非是不可逾越的鸿沟;

  • 应用开发采用的不同编程语言,会导致跨架构移植难度绝然不同。C/C++等系统级语言所编写的应用程序,其移植需要经过重新编译、链接、运行等全过程,难度相对较大;而以 Java 为代表的虚拟机语言则具备良好的跨平台移植性;而对于 Python、JavaScript 等脚本型语言来说,移植难度会更小。从这个角度来看,在云计算环境下开发应用程序,建议优先选择跨架构友好的编程语言。

  • 在大型应用系统迁移实践中,需要深入分析系统架构,有针对性的设计迁移方案。完成跨 CPU 架构迁移只是一小步,对于应用来说,如何借助云计算实现更好的可部署性、可伸缩性、便捷运维以及高并发带来的性能挑战,值得不断的探索。

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2021-03-18 14:552736

评论

发布
暂无评论
发现更多内容

深度认识单例模式;在Android源码中的应用,华为Android面试真题解析

android 程序员 移动开发

深入探索编译插桩技术(四、ASM 探秘,二本学渣考研失败

android 程序员 移动开发

深入浅出Android性能调优【全面深入易理解】,来一份全面的面试宝典练练手

android 程序员 移动开发

Python代码阅读(第51篇):判断给定的数是否在给定的范围内

Felix

Python 编程 Code Programing 阅读代码

Eureka 源码之启动过程

悟空聊架构

Eureka 源码剖析 悟空聊架构

在推荐几款ins视频和图片下载器,支持安卓和苹果

So...

Instagram ins ig ins视频和图片

告警风暴来袭,智能运维应如何化解?

云智慧AIOps社区

AIOPS 告警 技术学习 智能运维 时序数据

深入探索 Android 网络优化(三、网络优化篇,flutter页面跳转卡

android 程序员 移动开发

渣渣二本的辛酸面试之路:从深圳到杭州,从外包到蚂蚁金服

android 程序员 移动开发

Vue进阶(幺伍捌):vue组包 CssSyntaxError unclosed bracket 错误解决方法

No Silver Bullet

Vue 11月日更

这一次,解决Flutter Dialog的各种痛点!

小呆呆666

flutter ios android dart dialog

kubernetes系列随笔01:云原生发展

谦寻

Kubernetes 云原生 弹性

深入理解 Activty 加载速度优化,android开发实战-记账本清风紫雪

android 程序员 移动开发

渣本转岗,从Java到Android,这一年我经历了太多太多,移动开发者大会

android 程序员 移动开发

深入解析Android的StateListDrawable,项目实战

android 程序员 移动开发

深度探索 Gradle 自动化构建技术(四、自定义 Gradle 插件

android 程序员 移动开发

满足你各种姿势的最美Android开源日历,android音频

android 程序员 移动开发

使用 Spring Boot 和 @SpringBootTest 进行测试

码语者

Spring Boot 测试 test

深入学习-Gradle-自动化构建技术(六)Gradle-插件平台化框架-ByteX-探秘之旅

android 程序员 移动开发

深入解析Android-Studio中Gradle依赖,flutter扫描二维码

android 程序员 移动开发

深入理解AsyncTask的工作原理,成为阿里P7Android架构师到底有多难

android 程序员 移动开发

深入理解Flutter动画原理,一个月成功收割腾讯、阿里、字节offer

android 程序员 移动开发

【LeetCode】求众数 IIJava题解

Albert

算法 LeetCode 11月日更

深入并发原理和大厂面试(二),kotlin协程的理解

android 程序员 移动开发

滴滴DoKit Android核心原理揭秘之函数耗时,app架构图怎么做

android 程序员 移动开发

滴滴开源DRouter:一款高效的Android路由框架,androidui开发工具

android 程序员 移动开发

【Flutter 专题】20 图解 ListView 下拉刷新与上拉加载 (三)【RefreshIndicator】

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 11月日更

深入分析ConstraintLayout的原理及应用场景,万字总结

android 程序员 移动开发

滴滴国际化项目 Android 端演进,一个小例子彻底搞懂Android的MVP模式到底是什么

android 程序员 移动开发

渣本安卓客户端Android秋招总结(重排了字号),android项目实战手机安全卫士

android 程序员 移动开发

漫谈MVVM(1)ViewModel_DataBinding核心原理,kotlin开发安卓游戏

android 程序员 移动开发

上云实践:从X86到ARM,跨越CPU架构鸿沟_文化 & 方法_王一 中国电子云_InfoQ精选文章