写点什么

上云实践:从 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:553355

评论

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

如何做好FAQ页面的设计

小炮

FAQ

企评家,专注企业评价,为企事业单位提供信息数据支撑

企评家

百度智能云特色城市业务指挥平台,助力城市管理更智能

百度开发者中心

再谈JavaScript 中的对象解构

devpoint

JavaScript ES6 5月月更 赋值解构 对象操作

linux之yum源设置代理

入门小站

Linux

下个牛市,Web3世界的龙头项目PlatoFarm能否踏足山巅

BlockChain先知

架构实战营作业五

库尔斯

#架构实战营

为什么你的maven打包老是出现问题

ZuccRoger

5月月更

时序数据库在智慧用电领域的应用

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

druid 源码阅读(三)初始化连接池(2)

爱晒太阳的大白

5月月更

观测云社区版发布,免费体验全功能私有化实例!

观测云

运维 可观测性 可观测

【刷题第六天】35. 搜索插入位置

白日梦

5月月更

企评家|海信视像科技股份有限公司成长性报告简述

企评家

ElasticSearch查询流程详解

IT巅峰技术

守护数据安全,天翼云是认真的!

天翼云开发者社区

云计算 云服务 数据安全

微博评论高性能高可用计算架构设计

踩着太阳看日出

架构训练营

【C语言】指针One之[概念、前言、内存、地址与指针、变量与地址]

謓泽

C语言 5月月更

工业金属零部件质检解决方案详解,让AI质检一步到位!

百度开发者中心

Gartner发布CIO最新调研结果,可组装EBC备受瞩目

金蝶云·苍穹

在线Base64编码加密解密还原工具

入门小站

工具

「可视化案例Vol.4」智慧社区,引领社区管理新风向

ThingJS数字孪生引擎

全国唯一!这家企业的工业互联网平台上云啦!

天翼云开发者社区

云计算 解决方案 云服务 工业互联网 云平台

强强联合,天翼云安全能力再升级!

天翼云开发者社区

云计算 基础设施 云服务 云安全

模块五

ASCE

面试还不会Spring?阿里P8总结的100道面试解析,让你实锤面试官

Java浪潮

Java 编程 架构

[ts]后台管理数据权限控制实现(无业务修改)

林逸民

typescript 工厂模式 权限控制 依赖注入

关于数据保护官DPO(34/100)

hackstoic

企业安全 DPO 数据保护官

Hoo网格策略活动仍在进行中 震荡市场持续狂欢

区块链前沿News

量化策略 Hoo 网格

首次全面定义,《2022企业应用运维管理指标体系白皮书》重磅发布

博睿数据

白皮书 博睿数据

设计微博系统中”微博评论“的高性能高可用计算架构

流火

Maven 简介及安装

Emperor_LawD

maven 5月月更

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