写点什么

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

评论

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

区块链—重构新商业体系和全新商业生态环境

CECBC

机器通用运行框架抽象

型火🔥

架构 微服务 抽象 中间件 机器

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

白发青年

架构实战营

浅析「扣减库存」的方案设计

悟空聊架构

分布式 秒杀 电商 6月日更 库存

【Vue2.x 源码学习】第四篇 - 对象的深层劫持

Brave

源码 vue2 6月日更

你有没有 996 ?你要不要 955 ?

escray

学习 极客时间 朱赟的技术管理课 6月日更

架构实战营模块5作业

En wei

架构实战营

聊聊MySQL全局锁

架构精进之路

MySQL 6月日更

全栈程序员这个月写了啥代码?

程序员鱼皮

Java JavaScript 大前端 后端 全栈

极光开发者周刊【No.0604】

极光JIGUANG

程序员 开发者 IT行业

网络攻防学习笔记 Day35

穿过生命散发芬芳

网络攻防 6月日更

python——格式化输入输出与截取字符串

在即

6月日更

深入理解iOS图文混排原理并自定义图文控件

Geen练

图文混排 iOS Developer iOS 知识体系

【环球网】博睿数据CEO冯云彪:做好生态链企业的适配工作

博睿数据

博睿数据 博睿数据数据链DNA 生态链

MySQL基础之二:SQL语句介绍与使用

打工人!

MySQL sql查询 6月日更

区块链技术为版权保护与运营提供科技支撑

CECBC

【译】JavaScript 代码整洁之道-注释篇

KooFE

JavaScript 大前端 代码注释 6月日更 整洁代码

理解【Apache Zookeeper】

awen

zookeeper

算法如何促成亿级别扶持曝光视频?爱奇艺Budget Pacing智能扶植系统实践

爱奇艺技术产品团队

架构 推荐 算法 广告 扶植

Kubernetes手记(1)- Kubernetes概述

雪雷

k8s 6月日更

区块链作为“信任的机器”,将改变社会价值的传递方式

CECBC

数字中国的视觉进阶:ISP的来处与归途

脑极体

【立刻报名】加速开发 Perforce on Tour China 2021-龙智

龙智—DevSecOps解决方案

【得物技术】JS资源分包

得物技术

CSS 大前端 js 版本 页面

拍乐云运维专家受邀QECon大会,畅谈多云环境伸缩实践

拍乐云Pano

Nacos--简介

是老郭啊

微服务 nacos 服务注册与发现

Nacos-- docker搭建

是老郭啊

Docker nacos

从天而降的AI“青云梯”,开发者们准备好了吗?

白洞计划

模块五- 课后作业

Presley

架构实战营 #架构实战营

《原则》(四)

Changing Lin

博睿数据重塑APM,引领IT运维新标杆

博睿数据

博睿数据 数据链DNA 服务可达

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