写点什么

上云实践:从 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 架构迁移只是一小步,对于应用来说,如何借助云计算实现更好的可部署性、可伸缩性、便捷运维以及高并发带来的性能挑战,值得不断的探索。

2021-03-18 14:553528

评论

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

浅谈系统稳定性与高可用保障的几种思路

得物技术

高可用 架构设计 稳定性 稳定性保障 10月月更

前端刷完这12道滑动窗口,就可以出山面试了

js2030code

JavaScript LeetCode

AntDB内存管理之内存上下文

亚信AntDB数据库

AntDB aisware antdb AntDB数据库 企业号十月PK榜 企业号十月 PK 榜

企业数字化转型思考

dreamer

软件 数字化转型 信息化 制造业 智能化

前端leetcde算法面试套路之双指针

js2030code

JavaScript LeetCode

三项第一!天翼云通过DevSecOps能力成熟度评估认证

天翼云开发者社区

原生 JS 手写一个优雅的图片预览功能,带你吃透背后原理

茶无味的一天

JavaScript 前端 HTML5, CSS3 图片预览

一文读懂加密资产板块的盈利潜力与投资机会

股市老人

【学习记录】SQL注入--盲注

w010w

网络安全 学习笔记 CTF SQL注入 11月月更

乐高式扩展:在Seal软件供应链防火墙中轻松集成代码规范工具

SEAL安全

开源 DevOps 云原生 DevSecOps 软件供应链安全

亮相IDC年度盛典,天翼云以科技创新谱写数字化转型新乐章

天翼云开发者社区

BizWorks 应用平台基于 KubeVela 的实践

阿里巴巴云原生

阿里云 开源 云原生

【融云出海白皮书免费看】-巴西成增量潜力「应许之地」

融云 RongCloud

互联网 白皮书

共享存储是什么意思?与DRBD有什么区别?

行云管家

高可用 ha Skybility HA 高可用性

一文全面了解火山语音无监督预训练技术的落地实践

科技热闻

软件测试面试真题 | 经典SQL查询

测试人

数据库 软件测试 面试题 sql 测试开发

持续领跑,天翼云市场份额再攀升

天翼云开发者社区

转转图书对基于Drools引擎的DMN实践

转转技术团队

drools 规则引擎使用 规则引擎 转转 java 编程

JavaScript刷LeetCode拿offer-分治

Geek_07a724

JavaScript LeetCode

HummerRisk 使用场景:混合云安全治理(1)简介

HummerCloud

混合云 安全合规检测 11月月更

个保法一周年,每日互动(个推)分享隐私计算探索及实践

个推

大数据 联邦学习 数据治理 隐私计算 隐私安全

微信业务架构-探讨

Weldon

架构实战营

安全可信丨两个项目新入选可信边缘计算推进计划!

天翼云开发者社区

JavaScript刷LeetCode拿offer-并查集

Geek_07a724

JavaScript LeetCode

云安全厂商那么多,我们该怎么选择?

行云管家

云计算 企业上云 云厂商 云转售

数字先锋| 打造城市“一朵云”,天翼云推动芜湖新型智慧城市建设

天翼云开发者社区

实例解读丨关于GaussDB ETCD服务异常

华为云开发者联盟

数据库 华为云 企业号十月 PK 榜

前端leetcde算法面试套路之回溯

js2030code

JavaScript LeetCode

程序员买啥游戏机,自己动手做一个体感小游戏

华为云开发者联盟

人工智能 华为云 企业号十月 PK 榜 体感小游戏

JavaScript刷LeetCode拿offer-贪心算法

Geek_07a724

JavaScript LeetCode

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