1、概述
隨著IT技術(shù)的不斷演進(jìn),公有云、專屬云、混合云、云原生等相關(guān)技術(shù)概念層出不窮,云計(jì)算已經(jīng)有了廣泛應(yīng)用,成為數(shù)字經(jīng)濟(jì)、政企數(shù)字化轉(zhuǎn)型的新型基礎(chǔ)設(shè)施。 在云計(jì)算時(shí)代,由于功耗低、高性能以及指令集的優(yōu)勢(shì),越來越多的云廠商開始選擇基于ARM體系來構(gòu)建云服務(wù)。從AWS發(fā)布的Graviton2,到Apple的M1芯片,到中國電子云十年磨一劍的“PK架構(gòu)”,再到華為鯤鵬體系,ARM體系成為了未來的趨勢(shì)方向。 對(duì)于企業(yè)數(shù)字化轉(zhuǎn)型來說,應(yīng)用上云是必經(jīng)之路。從狹義來說,上云是將運(yùn)行在物理機(jī)上的應(yīng)用系統(tǒng)搬遷到云上。從廣義上看,上云會(huì)涉及到跨架構(gòu)適配、虛擬化、容器化、云原生等一系列的技術(shù)升級(jí)和重構(gòu)。 上云的不同階段,所依賴的技術(shù)并不同。從左至右,應(yīng)用對(duì)云的依存度也越來越高。
下文對(duì)幾個(gè)階段涉及到的技術(shù)做簡(jiǎn)單闡述。
階段1:跨架構(gòu)適配
傳統(tǒng)應(yīng)用大部分是基于X86架構(gòu)來開發(fā)和運(yùn)行。面對(duì)ARM架構(gòu)越來越流行的今天,越來越多的云計(jì)算廠商開始圍繞ARM架構(gòu)構(gòu)建云應(yīng)用生態(tài)。并據(jù)此引發(fā)了大量的適配測(cè)試需求。X86和ARM體系架構(gòu)的差異對(duì)于應(yīng)用有哪些影響?X86應(yīng)用向ARM體系遷移會(huì)碰到哪些技術(shù)難題?對(duì)于不同編程語言實(shí)現(xiàn)的應(yīng)用來說,遷移的難度是否有區(qū)別? 本文將針對(duì)以上問題開展分析。
階段2:虛擬化
計(jì)算虛擬化能力是云計(jì)算提供的核心能力。截至到今天,很多行業(yè)用戶的上云還是停留在這個(gè)階段。虛擬化的最大用途是使得應(yīng)用與物理機(jī)器解耦,將資源池化,按需分配資源,并因此獲得彈性伸縮和遷移能力。這個(gè)階段的上云,往往會(huì)涉及到P2V和V2V這兩種主要場(chǎng)景。前者是從物理機(jī)向虛擬機(jī)遷移(Physical to Virtual Migration)),后者是虛擬化的跨云遷移(Virtual Machine to Virtual Machine)。
階段3:容器化
容器化是將應(yīng)用程序及其所需的庫、框架和配置文件打包在一起的過程,以便可以在各種計(jì)算環(huán)境中高效運(yùn)行它。得益于Docker等技術(shù)的流行,應(yīng)用容器化更進(jìn)一步促進(jìn)了應(yīng)用的配置、依賴以及鏡像的標(biāo)準(zhǔn)化,使得應(yīng)用交付、運(yùn)維等領(lǐng)域有極大的提升。這個(gè)階段的上云,對(duì)于軟件開發(fā)過程有一定的要求,需遵循相應(yīng)的容器化規(guī)范。
階段4:云原生
云原生時(shí)代的到來,是容器化后的必然階段。通過Kubernetes、devops、微服務(wù)等技術(shù)的不斷發(fā)展,尤其是對(duì)有狀態(tài)應(yīng)用支撐能力的不斷增強(qiáng),云原生已然成為新一代應(yīng)用開發(fā)的事實(shí)標(biāo)準(zhǔn)。 技術(shù)的發(fā)展有天才工程師的靈光一現(xiàn),其背后同樣也需要遵循客觀自然規(guī)律。下文將從階段1入手,嘗試從底層技術(shù)進(jìn)行解構(gòu),或許能幫助我們更清晰的看到本質(zhì)。
2、跨越CPU架構(gòu)
縱觀計(jì)算機(jī)技術(shù)的發(fā)展史,軟件系統(tǒng)是一個(gè)不斷抽象,不斷疊加的過程。操作系統(tǒng)的出現(xiàn),解決的是單機(jī)硬件多樣性的難題,為上層應(yīng)用軟件提供一致的底層運(yùn)行環(huán)境。云計(jì)算的出現(xiàn),解決的是分布式架構(gòu)引入的多樣性問題,為應(yīng)用提供跨機(jī)器、跨地域的一致運(yùn)行環(huán)境。 我們先從CPU指令集的差異對(duì)比開始。
2.1 CPU指令集對(duì)比
在計(jì)算機(jī)體系結(jié)構(gòu)的發(fā)展過程中,誕生了CISC(復(fù)雜指令集)和RISC(精簡(jiǎn)指令集)這兩大流派,它們采用了不同的設(shè)計(jì)理念和方法,CISC采用單條復(fù)雜指令完成特定復(fù)雜功能,提高了存儲(chǔ)器訪問效率;RISC則采用多條精簡(jiǎn)短指令完成特定復(fù)雜功能,提高了處理器運(yùn)行速度?;谶@兩類指令集,產(chǎn)生了兩種主流的CPU架構(gòu):X86架構(gòu),采用的是CISC復(fù)雜指令集,而ARM架構(gòu)則采用了RISC精簡(jiǎn)指令集。 CISC指令集指令系統(tǒng)龐大,指令數(shù)目、指令格式和尋址方式復(fù)雜,指令字長(zhǎng)不固定,各種指令執(zhí)行周期和訪問頻率相差很大,采用微指令碼控制單元的設(shè)計(jì)。 RISC指令集選取使用頻率最高的精簡(jiǎn)指令,避免復(fù)雜指令,將指令數(shù)目、指令格式和尋址方式種類減少,指令長(zhǎng)度固定,大多數(shù)的指令都可以在一個(gè)機(jī)器周期里完成。以控制邏輯為主,不用或者少用微指令碼控制。
2.2對(duì)應(yīng)用遷移的影響
應(yīng)用本質(zhì)上是一種程序,程序在運(yùn)行態(tài)是由一系列進(jìn)程組成,而進(jìn)程可以說是計(jì)算機(jī)科學(xué)最重要和最成功的概念之一。進(jìn)程的運(yùn)行依賴操作系統(tǒng)對(duì)CPU、內(nèi)存的調(diào)度和管理,操作系統(tǒng)保持跟蹤進(jìn)程運(yùn)行所需的所有狀態(tài)信息。比如寄存器、PC計(jì)數(shù)器、邏輯單元ALU等。 綜合來說,X86 和ARM屬于不同的架構(gòu)。X86屬于復(fù)雜指令集,而ARM屬于精簡(jiǎn)指令集, X86 上的程序根本不可能毫無阻礙地就可以在ARM上使用,必須經(jīng)過適配遷移。 從另外的角度來看,應(yīng)用選擇不同的編程語言,會(huì)有不同的跨架構(gòu)能力。下面分析下主流的C++和Java應(yīng)用在不同架構(gòu)下的差異表現(xiàn)。
2.3.1 C/C++語言
眾所周知,C/C++程序是計(jì)算機(jī)系統(tǒng)級(jí)別最為成功的語言之一。業(yè)界存在大量的知名開源軟件基于C/C++構(gòu)建,比如Windows/Linux操作系統(tǒng)自身,以及使用廣泛的分布式存儲(chǔ)系統(tǒng)Ceph。 在C/C++世界里,從源代碼演變成運(yùn)行中的進(jìn)程,需要經(jīng)歷編譯、匯編、鏈接、運(yùn)行等一系列過程。
a) Step 1編譯
編譯是將源代碼經(jīng)過處理,轉(zhuǎn)變成匯編語言的過程。這一過程的關(guān)鍵工具是編譯器。有了編譯器的存在,現(xiàn)代編程語言(如C++)的源代碼一般能做到架構(gòu)無關(guān),通過不同平臺(tái)編譯器(如GCC)的處理,可以得到不同體系結(jié)構(gòu)下的匯編代碼。 舉例如下源代碼:
在X86平臺(tái)編譯器編譯后,得到匯編代碼如下:
備注:以上mov、push等均為X86體系架構(gòu)匯編指令。 在ARM平臺(tái)編譯后,得到匯編代碼如下:
備注:以上mov,STR,LDR均為ARM架構(gòu)匯編指令。 匯編指令的簡(jiǎn)單對(duì)比如下:
僅從常用指令集名稱來看,兩者比較相似,但實(shí)際大相徑庭。
舉例說明,在ARM指令中,MOV與ADD之間需要通過STR和LDR兩條指令完成數(shù)據(jù)從內(nèi)存往寄存器的加載,其原因是ARM算術(shù)指令只能運(yùn)行在寄存器,而X86則無此限制。
其他差異本文不再一一分析。
由此可以看出,X86和ARM架構(gòu)的指令集差異很大,對(duì)于C++語言來說,編譯器幫我們搞定這些差異,但需要從源代碼重新編譯。
b) Step 2 匯編
匯編是將匯編代碼轉(zhuǎn)變成機(jī)器代碼的過程。以上匯編代碼在X86平臺(tái)下,得到的機(jī)器代碼如下:
備注:以上為局部截圖。 而在ARM平臺(tái)下,得到的機(jī)器代碼會(huì)完全不同。
c) Step 3 鏈接
鏈接在C++語言特有的處理機(jī)制,將OS里的鏈接庫與程序進(jìn)行鏈接的過程。這一過程的輸出物即為可執(zhí)行程序。最終的運(yùn)行,對(duì)于C++和Java來說,通常都有Main函數(shù)作為程序的運(yùn)行入口(某些框架會(huì)對(duì)其進(jìn)行封裝,如Java Spring框架)。
綜合以上,對(duì)于C/C++開發(fā)的應(yīng)用程序來說,向ARM架構(gòu)遷移需要完成重新完成編譯、匯編、鏈接的全過程,應(yīng)用跨架構(gòu)遷移的難度較大。
2.3.2 Java語言
Java語言在Web應(yīng)用開發(fā)占據(jù)絕對(duì)的主導(dǎo)地位。Java是基于虛擬機(jī)的語言,也是所謂提供跨平臺(tái)運(yùn)行能力的語言。Java應(yīng)用從源代碼到運(yùn)行,需經(jīng)歷編譯、運(yùn)行兩個(gè)環(huán)節(jié)。 **
a) Step 1 編譯
使用javac命令進(jìn)行編譯,通常得到j(luò)ava字節(jié)碼文件,以.Class后綴命名的文件。
以下面的代碼為例。
X86環(huán)境編譯得到的字節(jié)碼如下:
備注:以上為局部截圖。
ARM機(jī)器上編譯,得到如下字節(jié)碼:
經(jīng)比較,會(huì)發(fā)現(xiàn)兩者得到的字節(jié)碼基本一致。
b) Step 2 執(zhí)行
Java體系為X86和ARM分別提供了不同的JVM。在運(yùn)行時(shí),JVM通過類加載器執(zhí)行以上字節(jié)碼文件。
備注:實(shí)際運(yùn)行時(shí),JVM會(huì)將字節(jié)碼轉(zhuǎn)換成機(jī)器碼來運(yùn)行,這個(gè)過程暫且忽略不表。
綜合來看,對(duì)于Java應(yīng)用來說,X86和ARM架構(gòu)的差異完全由JVM層屏蔽,應(yīng)用跨架構(gòu)遷移的難度很小。
上文主要從CPU架構(gòu)差異、編程語言差異的角度來分析對(duì)應(yīng)用的影響。下面結(jié)合中國電子云的實(shí)際上云案例來做進(jìn)一步的闡述。
3、藍(lán)信上云實(shí)踐
藍(lán)信是中國電子云上運(yùn)行的重量級(jí)應(yīng)用之一,作為中國電子云“一云一端”的戰(zhàn)略組成部分,提供安全可靠的企業(yè)消息通訊、視頻會(huì)議和協(xié)同辦公能力,在政企市場(chǎng)有著廣泛的應(yīng)用場(chǎng)景。
3.1 藍(lán)信對(duì)中國電子云的適配過程
藍(lán)信原生是構(gòu)建在X86體系架構(gòu)下的,針對(duì)中國電子云底層采用PKS架構(gòu),需要做整個(gè)系統(tǒng)的適配,主要工作體現(xiàn)以下幾點(diǎn):
1)針對(duì)體系架構(gòu)改變的適配
代碼級(jí)重新編譯以適配ARM架構(gòu),由于目前流行的開發(fā)語言早已對(duì)ARM體系進(jìn)行過適配(例如,golang,java,c/c++, python等)這部分工作難度不大。
2)數(shù)據(jù)庫的適配
數(shù)據(jù)庫部分,藍(lán)信需要從MySQL遷移到達(dá)夢(mèng)數(shù)據(jù)庫,由于達(dá)夢(mèng)數(shù)據(jù)庫對(duì)MySQL語句的良好支持,只有部分語法存在兼容性問題,僅需在數(shù)據(jù)層進(jìn)行適配,業(yè)務(wù)層并不需要改動(dòng),整體適配可在一個(gè)月內(nèi)完成,其中主要成本集中在適配后的全量功能測(cè)試上。
3)基礎(chǔ)設(shè)施及中間件的適配
藍(lán)信依賴的基礎(chǔ)設(shè)施及中間件也需要適配,例如etcd,k8s,redis,kafka,mongoDB等,這部分工作由于大部分基礎(chǔ)組件已經(jīng)有了ARM版本,直接使用即可,極個(gè)別的組件,需要進(jìn)行源碼級(jí)的編譯。
4、總結(jié)和思考
在當(dāng)前數(shù)字產(chǎn)業(yè)大發(fā)展的背景下, 對(duì)ARM架構(gòu)的關(guān)注必然會(huì)不斷升溫,各行業(yè)會(huì)出現(xiàn)大量應(yīng)用從X86向AMR架構(gòu)遷移,也催生了大量的應(yīng)用跨架構(gòu)適配測(cè)試需求。 通過前文的分析,我們可以得出如下結(jié)論:
1、X86架構(gòu)和ARM架構(gòu)的確存在較大差異。兩者在指令集、寄存器等方面均有很大的不同,但對(duì)于應(yīng)用系統(tǒng)的移植來說,并非是不可逾越的鴻溝;
2、應(yīng)用開發(fā)采用的不同編程語言,會(huì)導(dǎo)致跨架構(gòu)移植難度絕然不同。C/C++等系統(tǒng)級(jí)語言所編寫的應(yīng)用程序,其移植需要經(jīng)過重新編譯、鏈接、運(yùn)行等全過程,難度相對(duì)較大;而以Java為代表的虛擬機(jī)語言則具備良好的跨平臺(tái)移植性;而對(duì)于Python、JavaScript等腳本型語言來說,移植難度會(huì)更小。從這個(gè)角度來看,在云計(jì)算環(huán)境下開發(fā)應(yīng)用程序,建議優(yōu)先選擇跨架構(gòu)友好的編程語言。
3、在大型應(yīng)用系統(tǒng)遷移實(shí)踐中,需要深入分析系統(tǒng)架構(gòu),有針對(duì)性的設(shè)計(jì)遷移方案。
完成跨CPU架構(gòu)遷移只是一小步,對(duì)于應(yīng)用來說,如何借助云計(jì)算實(shí)現(xiàn)更好的可部署性、可伸縮性、便捷運(yùn)維以及高并發(fā)帶來的性能挑戰(zhàn),值得不斷的探索。
審核編輯:湯梓紅
-
ARM
+關(guān)注
關(guān)注
134文章
9084瀏覽量
367380 -
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211574 -
云計(jì)算
+關(guān)注
關(guān)注
39文章
7774瀏覽量
137351 -
X86
+關(guān)注
關(guān)注
5文章
294瀏覽量
43444
原文標(biāo)題:從X86到ARM,跨越CPU架構(gòu)鴻溝
文章出處:【微信號(hào):架構(gòu)師技術(shù)聯(lián)盟,微信公眾號(hào):架構(gòu)師技術(shù)聯(lián)盟】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論