鯤鵬軟件遷移學習筆記(理論部分加實操作 上)
分為理論和實操部分
理論部分
鯤鵬軟件遷移概述
鯤鵬軟件遷移,處理器指令集的差異,使得原來運行在x86的程序可能無法直接在鯤鵬平臺運行。鯤鵬開發套件可以幫助開發者掃描分析源碼/軟件包,識別修改點,協助開發者完成軟件遷移。
使用鯤鵬開發套件,對源代碼/軟件包進行分析掃描,識別修改點,快速將軟件遷移到至鯤鵬平臺
鯤鵬代碼遷移工具是一款可以簡化客戶Linux應用遷移到基于鯤鵬916/鯤鵬920的服務器或鯤鵬云服務(彈性云服務器KC1實例、裸金屬服務器)過程的工具。當客戶有源碼的軟件遷移到鯤鵬平臺上時,可用該工具自動分析出需修改的代碼內容,并指導如何修改,該工具能夠解決客戶代碼兼容性人工排查困難、遷移經驗欠缺、反復依賴調試定位等,投入工作量大,整體效率低的痛點,通過該工具能夠分析待遷移軟件源碼文件,給出代碼遷移指導報告,可遷移性評估及遷移建議可視化,一鍵式代碼替換,降低遷移難度,提升遷移效率。本工具僅適用于開發和測試環境。僅支持x86 Linux到鯤鵬Linux的掃描與分析,不支持Windows軟件代碼的掃描、分析與遷移。
遷移的五個步驟(遷移準備,遷移分析,編譯遷移,性能調優,測試與認證)
1,遷移準備
(
信息收集
軟件信息:
開源軟件,商用軟件
中間件/編譯器
操作系統/虛擬機
硬件信息 芯片/服務器信息
環境申請
Openlab遠程軟件,一站式遷移調優
平臺移植X86 -> 鯤鵬 --->兼容性測試 --->技術認證
業務流:源代碼移植檢查 編譯構建 性能調優 自動化測試 認證發布
測試套: 兼容性測試 穩定性測試 性能測試 安全測試 功耗測試
工具鏈:移植知識庫 掃描工具 遷移工具 性能分析工具 自動化測試工具
)
2,遷移分析(
軟件棧分析:
業務軟件:
開源軟件 獲取開源軟件ARM64軟件包或下載源代碼重新編譯
依賴組件 獲取ARM64包或獲取源碼重新編譯,閉源組件需升級替換ARM版本或替換類似組件庫
自研軟件:
編譯語言c/c++/GO類編譯語言重新編譯
解釋語言java/python等解釋型語言代替ARM版本JDK或PVM虛擬機
商用軟件 獲取致辭鯤鵬處理器或TaiShan服務器的軟件版本 ? 如無法獲取到兼容版本,需要換其他類似軟件
運行環境
JDK: 替換致辭鯤鵬版本JDK,如OpenJDK,Huawei JDK等
編譯器:替換支持鯤鵬編譯器,如GCC9.1
操作系統 替換鯤鵬操作系統,可使用智能計算產品兼容性查詢助手查詢
編程語言/代碼/依賴庫分析)
3,編譯遷移(
代碼遷移;
子類
編譯型語言 ?c/c++/go
修改點
代碼修改:源碼中對指令集依賴的宏定義及builtin函數
腳本修改: 替代成支持鯤鵬的編譯選項
內聯匯編:替代后重新編譯,比如rdtsc指令等
不兼容指令:如SSE lintrinsic類加速指令,需重新編寫
解釋型語言
java/python
直接翻譯:解釋性語言開發的應用程序,代碼無需修改,程序也不需要重新編譯,如java軟件安裝ARM版本JDK即可
依賴庫編譯:如果軟件含依賴庫,則需要重新編譯
軟件包遷移;RPM DEB
掃描依賴:掃描軟件包的運行依賴庫/可執行程序
依賴庫編譯:編譯型語言需重新編譯,解釋性語言基于對應的虛擬機運行
軟件打包:按照軟件安裝包原有結構重新制作成鯤鵬的軟件包
)
4,性能調優(
性能指標測試:
建立基準 調優前根據當前的硬件配置,組網,測試模型做綜合評估,建立合理的調優目標。
壓力測試 通過壓力測試工具對系統加壓,同時監控系統數據,記錄數據變化
確定瓶頸 在壓力測試下,測試系統比較容易顯示。系統的瓶頸通常會在cpu過于繁忙,lo等待,網絡等待,響應時延等方面出現。
實施優化 根據瓶頸點針對性地實施優化措施,同時記錄優化措施,一旦出現負向效果,及時回退。
確認效果 重新啟動壓力測試,準備好相關的工具監視系統,確認優化效果。
性能優化
)
5,測試與認證 ?壓力測試,長穩測試,規模商用/鯤鵬展翅認證
(
功能測試 測試業務基本功能在鯤鵬上運行是否正常,含單元測試及系統集成測試
性能測試 測試業務性能表現是否符合目標,同時監測各系統指標是否正常
長穩測試 長時間運行測試程序,以檢測業務能否長期穩定運行
規模商用 上市資料刷新 割接上線
)
金融行業核心系統整體切換案例
遷移規模:整體遷移,涉及的商業軟件較多,編碼類型主要以java居多,涉及的java軟件包100多個
測試場景:大數據/數據庫/虛擬化/物理機性能/業務系統功能
工作量:整體遷移用時1.5個月,測試及調優用時1個月
測試結果:各業務系統功能驗證通過,各測試場景性能均優于友商
鯤鵬開發套件,使能開發者,加速算力升級
遷移分析(技術可行性)--> 編譯遷移(功能可用) -->性能調優(性能更優) -->Hello Kunpeng!
分析掃描工具
軟件兼容性列表
依賴庫檢查評估
代碼改動量評估
移植評估
遷移工具
軟件構建遷移
源文件遷移
依賴庫遷移
移植指導報告
性能優化工具
性能分析全景
系統/進程/線程函數分析
軟件調優建議
性能分析&調優UI
C/C++代碼遷移
編譯型語言源碼--可執行性程序過程介紹
編譯型語言:C/C++/GO
編譯型語言開發程序從x86處理器遷移到鯤鵬處理器時,必須經過重新編譯才能運行
從源碼到程序的過程:源碼需要由編譯器,匯編器翻譯成機器指令,再通過鏈接器鏈接庫函數生成機器語言程序
源碼->預處理->預編譯文件->編譯->匯編代碼->匯編->目標文件->鏈接->可執行文件
C/C++代碼需移植的原因:
架構差異:x86和鯤鵬處理器(aarch64)屬于不同架構
指令集差異:x86--復雜指令集,鯤鵬處理器--精簡指令集。
向量寄存器差異:x86和鯤鵬處理器使用向量寄存器不同,向量指令集也存在差異。
C/C++代碼工程主要包括兩類文件:編譯構建腳本,C/C++源碼
編譯腳本 Makefile CmakeLists.txt Configure autogen.sh bootstrap.sh 等
C/C++源碼 src examples tests 等
可能涉及的移植項目
編譯構建腳本類文件
編譯選項的移植(指定數據類型,生成代碼特征,目標執行器架構,處理器硬件加速功能等)
C/C++源碼類文件
編譯宏移植(用戶自定義宏移植,編譯器自定義宏移植)
編譯器自帶builtin函數移植
內聯匯編移植
SSE intrinsic函數移植(MMX/SSE類函數移植,AVX函數移植)
C/C++代碼編譯構建過程
CMakeLists.txt ->
獲取源碼->準備編譯環境-> ?configure ? ? -> Makefile文件 -> 編譯 ->替換依賴庫 ->安裝部署
1獲取源碼 :通過github或第三方開源社區獲取
2準備編譯環境:安裝編譯器gcc等
3使用源碼中的CMakelist.txt或configure腳本生成makefile
4執行Makefile編譯可執行程序
5替代依賴庫:重編譯或替代依賴x86平臺的so庫
6,將可執行程序安裝部署到生產或測試系統
代碼遷移-編譯腳本,編譯選項移植
功能說明 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? x86代碼 ? ? ? ? ? ? ? 鯤鵬代碼
64位編譯 定義編譯生成的應用程序為64位 ? ? ? ? ? ? -m64 ? ? ? ? ? ? ? ? ? ? -mabi=ip64
數據類型 顯示定義char類型變量為有符號類型 ? ? char a = 'a' ? ? ? ? ? 方法1:signed char a = 'a' ?方法2: -fsigned-char 方法1可能潛在一些弊端
代碼遷移-編譯宏移植
編譯宏
功能 ? ? ? ? ? ? ? ? ? ? ? ? ? ?x86編譯選項 ? ? ? ? ? ? ? ? ?鯤鵬編譯選項
原有x86編譯宏移植(gcc編譯器自定義宏) ? ? ?_x86_64或_x86_64 ? ? ? ? ? ? ? ? _aarch64_
平臺屬性意義編譯宏移植(用戶自定義編譯宏)x86_64 HAVE_x86_64 ? ? ? ? ARM_64HAVE_AARCH64
功能說明 ? ? ? ? ? ? ? ? ?x86代碼 (編譯器自定義) ? ? ? ? ? ? ? ? ? ? ? 鯤鵬代碼
說明平臺屬性的宏定義 ? ? ? ? ? ? _amd64_或_amd64 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? _aarch64_
SIMD屬性相關宏 ? ? ?_SSE_/或SSE2_/_SSE3_/_SSE4_1_/SSE4_2/ ? ? ? ? ? 自定義NEON語義編譯宏,實現對應功能分支
代碼遷移-builtin函數移植
Builtin函數
功能 8bit數據的crc32效驗值計算
x86指令 ? _builtin_ia32_crc32qi(_a,_b)
鯤鵬指令 ?_builtin_aarch64_crc32cb(_a,_b)
大部分需移植的 builtin函數集中在SSE intrinsic函數內
功能說明 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? x86代碼 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 鯤鵬代碼
計算16bit數的crc32效驗值 ? ?_builtin_ia32_crr32hi(_a,_b) ? _builtin_arrch64_crr32cb(_a,_b)
計算32bit數的crc32效驗值 ? ?_builtin_ia32_crr32si(_a,_b) ? ?_builtin_arrch64_crr32ch(_a,_b)
計算64bit數的crc32效驗值 ? ?_builtin_ia32_crr32di(_a,_b) ? _builtin_arrch64_crr32cx(_a,_b)
代碼移植-內聯匯編函數移植
內聯匯編
功能 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?x86指令 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?鯤鵬指令
將字節序進行反序 ? ? _asm_("bswap %0":"=r" (val):“0”(val)) ? ? ?_asm_("rev %w[dst],%w[src]":[dst]"=r" (val):[src]“r”(val))
(匯編指令方式替換)
val:0x56781314=>0x14137856
計算變量a(uint64_asm_("popcnt %1,%0":"=r" (result):“mr”(a):"cc") ?Result=_builtin_popcountil(a)
的二 進制中1的個數
(builtin函數方式替換)
a:0111(7)=>result:3
代碼移植-SSE intrinsic函數移植(SIMD技術)
SIMD(single instruchtion Multi Data)是一種單指令處理多數據流的并行處理技術,能夠在批量數據操作時進行向量
化運行加速,具有較高的執行效率,在多媒體處理,矩陣運算等場景都有廣泛的應用。
SSE(intel的SIMD擴展指令集的簡稱) MMX->SSE->SSE2->SSE3->SSE4->AVX256->AVX512->
NEON(基于SIMD思想的ARM技術) 典型NEON Lib庫:Arm Compute Library(ACL),Ne10,libyuv,skia
代碼移植-SSE intrinsic函數移植(AVX)
AVX指令計算16個單精度浮點數之和
_256d_mm256-add_ps(_m256A,_m256B)
向量A ? ? A.. A1 A0
+ ? ?+ ? +
向量B ? ? B.. B1 ?B0
= ? ?= ? ?=
向量C ? C.. ? C1 ?C0
AVX指令說明
AVX 指令集架構的改進和增強的功能:
128 位 SIMD 寄存器 xmm0 - xmm15 擴展為 256 位的 ymm0 - ymm15 寄存器
支持 256 位的矢量運算,由原來 128 位擴展為 256 位
指令可支持最多 4 個操作數,實現目標操作數無需損毀原來的內容
引進新的 AVX 指令,非 Legacy SSE 指令移植
新增 FMA 指令子集
引進新的指令編碼模式,使用 VEX prefix 來設計指令編碼
AVX 提供了一個子集:
FMA 指令集
FMA 指令集進行 fused multiply-add/subtract 類運算,用式子表達為:
± (a * b) ± c
鯤鵬指令計算16個單精度浮點數之和
float32x4_t C1=vaddq_f32(A1,A2)
向量A ? ? A.. A1 A0 ? ? 向量A ? ? A.. A21 A20
+ ? ?+ ? + ? ? ? ? ? ? ? ? ? + ? ?+ ? +
向量B ? ? B.. B1 ?B0 ? ? 向量B ? ? B.. B21 ?B20
= ? ?= ? ?= ? ? ? ? ? ? ? ? ? = ? ?= ? ?=
向量C ? C.. ? C1 ?C0 ? ? 向量C ? C.. ? C21 ?C20
D=C0+C1+C..+C20
鯤鵬指令說明
鯤鵬處理器采用精簡指令集,使用128位寄存器實現SIMD(single instruction Multi Data)計算。
在實現16浮點數的相加時,使用兩條vaddq_f32指令分別完成,每條指令完成兩組共8個浮點數計算,最后再從向量寄存器中分別取出8個浮點數累加
代碼遷移—SSE intrinsic函數移植方法
方法1:基于avx2neon.h,SSE2NEON.h開源文件移植
鯤鵬AvxToNeon開源工程:https://github.com/kunpengcompute/AvxToNeon
包含SSE類intrinsic函數的NEON實現(字符串比較,crc32值計算,popcnt計算等)
包含基礎的AVX256,AVX512類intrinsic函數的NEON實現(strore,運算,移位等操作指令)
開源的SSE2NEON工程:https://github.com/DLTcollab/sse2neon/blob/master/sse2neon.h
主要實現SSE類intrinsic函數替換(整數,單浮點數據類型)
涵蓋基礎的load,strore,set,運算操作等指令的NEON實現
方法2:手動替換移植
SSE lntrinsics Guide網站: https://software.intel.com/sites/landingpage/lntrinsicsGuide/
NEON lntrinsic Guide網站:https://developer.arm.com/arch
在需移植文件中添加頭文件 arm_neon.h
代碼遷移—Porting Advisor初步代碼掃描
Porting Advisor是一款華為鯤鵬代碼遷移工具,針對c/c++代碼掃描分析,
檢測用戶C/C++代碼中需移植修改的MakeFile編譯文件,x86匯編及SSE intrinsic函數,并指導用戶如何移植。
鯤鵬開發套件 — Porting Advisor;
https://www.huaweicloud.com/kunpeng/software/portingadvisor.html
1,Lmpala源碼下載及掃描分析
2,掃描報告解讀及運用
核心類移植項及遷移方法:
編譯選項移植:關注平臺差異項(用好編譯器官方文檔)
編譯宏移植:區分編譯器/用戶自定義宏編譯
builtin函數移植:關注常用builtin函數替換
內聯匯編移植:識別核心匯編指令,用好匯編指令/builtin函數替換
SSE intrinsic函數移植:開源工程,官網指導手冊相結合
Java/Python代碼遷移
Java代碼遷移
從源碼到可執行程序
Java源碼遷移修改點 ? ? ? ? ? ? ? ? ? ? ? ? ? ?.so庫 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.so庫
安裝JDK-->java源碼-->java編譯器-->.class文件-->.jar包-->部署運行 ? -->-->--> ? ? ?1,安裝JDK-->java源碼-->java編譯器-->.class文件-->.jar包-->3.部署運行
1.安裝JDK改動點(定制版本需源碼編譯) 2.引用SO庫的改動點(替換成aarch64的SO庫)3程序運行時改動點(設置JVM參數)
java代碼遷移:安裝合適的JDK版本
升級已成適配的JDK,用穩定成熟的高JDK版本的原因
1,生成環境更加注重穩定性
2,對老版本的問題進行了修復和改進
新增特性使編程更加方便簡潔
OpenJDK或HuaweiJDK適配器,支持通過yum命令直接安裝
需要源碼編譯,安裝制定的JDK或其他版本JDK
安裝GCC
獲取JDK源碼
配置編譯選項(部分列舉)
export LANG=C#語言選項
--with-target-bits=64 # 64位機器
--disable-warnings-as-errors #調試等級
make all 或make images啟動編譯
編譯完成,設置環境變量
進行驗證(java-version)
典型遷移場景處理
案例分享
Python代碼遷移
從源碼到可執行程序
典型遷移場景處理
案例分享
java代碼遷移:包含SO庫調用的jar包遷移方法
jar包結構,調用了SO庫
-->io目錄-->.class文件
netty-all-4.1.46.Final.jar-->META-INF目錄-->x86的.so庫 -->其他文件
下一步重新編譯so
重新編譯so庫替換,完成遷移
遷移步驟
1, Dependency Advisor工具分析掃描jar包
2, 識別依賴庫so庫
3, 下載so庫源碼
4, 安裝maven
5, 安裝GCC
6, 設置參數-fsigned-char
7, ? 編譯aarch64版本so庫
8, 替換so庫
9, 重新打包jar文件
java代碼遷移:設置JVM參數,穩定快速的運行程序
JVM參數設置:3個經驗+2個差異
經驗1:完成一次Full GC后,應該釋放出70%的堆空間(30%的空間仍然占用)
經驗2:假設老年人代存活對象(即Full GC后老年代內存占用)大小為X
經驗3:官方建議年輕代大小占整個堆空間大小的3/8左右。
差異1:線程棧大小的Xss參數在ARM上默認值為2M,在X86上為1M,諾線程開的太多,需要使用Xcc調整線程棧的大小,防止OOM
差異2:由于ARM和x86指令集的差異性,導致JDK的JIT編譯存在差異。可以通過設置參數
ReservedCodeCacheSize,調整CodeCache大小。
源碼編譯,安裝OpenJDK9
1,下載DJK源碼
yum install mercurial -y
hg clone http:/hg.openjdk,java.net/jdk9/jdk9
cd jdk9
sh get_source.sh
2,設置參數,開源編譯
安裝依賴: yum groupinstall "Development Tools" java-1.8.0-openjdk-devel-y
配置參數: bash configure --with-target-bits=64 --disable-warnings-as-errosr --with-debuglevel=slowdebug --with-boot-jdk=/opt/tools/installed/jkd8u191-b12
編譯:make all
驗證:build/linux-aarch64-normal-server-slowdebug/jdk/bin/java -version
案例neety-all-4.1.34.Final.jar遷移
1.分析掃描工具(Dependency Advisor)掃描結果,有1個依賴SO庫需要移植
2.將jar包中調用的.so庫重新編譯替代為aarch64版本,并重新打包jar包(mvn自動完成)
安裝GCC,設置參數-fsigned-char
安裝Maven
安裝OpenJDK
下載netty-all-4.1.34和依賴netty-tcnative-2.0.22
解壓netty-tcnative-2.0.22,并編譯(mvn install)
解壓netty-all-4.1.34, 并編譯(mvn install)
編譯生成的jar包解壓后確認已經包含aarch64的so庫
JVM參數設置,解決服務掛死問題
1,調整線程棧大小或內存大小,解決OOM問題
問題描述:鯤鵬容器壓測8小時,在第三個小時有4臺鯤鵬容器內存全部耗盡,服務主進程掛死
1.分析業務代碼是否有內存泄露
措施:將ARM容器內存大小從4G提升為8G,長穩測試
結果:4臺ARM容器正常運行未掛死
結論:非業務代碼導致的內存泄露
2.分析ARM和x86上JVM參數差異
措施:全面對比jvm運行參數版本信息
結果:jvm版本一致,堆空間大小一致,線程棧大小不一致,ARM為2M,x86為1M
結論:線程棧多1M,會導致450個線程多用450內存,超過堆內存,引發OOM
3.總結
ARM服務器上默認的線程堆棧大,線程多會導致比x86多占用內存
建議修改參數減少棧大小(-Xss1024k),或者擴充內存-Xmx8g-Xms8g)。
java遷移小結
1.改動點:安裝JDK版本
通過yum安裝
源碼編譯安裝
2.引用的SO庫需重新編譯
3.根據業務實際情況,調整JVM參數
python從源碼到運行
安裝python環境-->python-->python編譯器-->.pyc字節碼-->python解釋器-->部署運行
python代碼遷移改動點 1,安裝python環境 2,C部分編譯成so庫
python從源碼到運行 ,python代碼遷移改動點詳情如圖
maven倉軟件構建
java構建工具
在java開發工具圈中,目前最主流的有以下三個開發工具,依賴管理已經成為了項目構建自動化工具中的一個主要部分
lvy依賴 maven依賴 gradle依賴 三個工具的依賴管理已經成為了項目自動化構建的主要部位
Maven是Apache下的一個純java開發的開源項目,基于項目對象模型(POM),可以對java項目進行構建,依賴管理
Maven官方鏈接: http://maven.apache.org/
Maven依賴管理
java中,可以用groupld,artifactld,version組成的Coordination(坐標)唯一標識一個依賴。
pom.xml文件中一個典型的依賴引用如下圖,Maven編譯時會自動拼接路徑和文件名,去本地或遠程倉查找。儲存這些組件的倉庫有遠程倉庫和本地倉庫之分
Maven倉庫分類
本地倉
儲存在本地磁盤默認在${user.home}/.m2下
遠程倉
一般使用國內鏡像或者公司自己塔建私服,可以加速jar包下載速度。
中央倉庫
Maven團隊維護的jar包倉庫http://repo1.maven.ong/maven2/
Maven倉庫搜索順序
本地倉庫-->遠程倉庫--> 中央倉庫
本地倉庫搜索
本地倉庫找到,直接返回
本地倉庫沒有找到,去遠程倉庫搜索
遠程倉庫搜索
沒有配置遠程倉庫,去中央倉庫搜索
遠程倉庫找到,下載到本地倉庫
遠程倉庫沒有找到,搜索下一個遠程倉,依次類推,如果所有遠程倉庫都沒找到,搜索中央倉
中央倉庫搜索
中央倉庫找到,下載到本地倉庫
中央倉庫沒有找到,前臺打印錯誤信息
Maven倉庫軟件構建流程
Maven倉庫軟件構建關鍵流程:將x86依賴文件替換成kunpeng依賴文件,重新構建,直到不包含x86依賴
查詢本地倉庫-->查詢遠程倉庫(優先查詢遠程鯤鵬maven倉庫),從遠程倉庫下載,并保存到本地倉庫-->構建軟件包-->DepenDency工具掃描依賴庫-->獲取源碼在鯤鵬機器上重新編譯--更新本地倉庫替換原jar包-->重新構建(構建程序)-->構建軟件包(tar.gz rpm等)
鯤鵬maven倉
maven倉部分jar包依賴x86 so,無法在鯤鵬上直接使用,需要在鯤鵬上重新編譯,部分jar包已編譯好放在鯤鵬maven倉內,可以直接使用。
鯤鵬maven鏈接:https://mirrors.huaweicloud.com/kunpeng/maven/
如何配置優先搜索鯤鵬Maven倉
Maven倉搜索順序,本地倉庫-->遠程倉庫-->中央倉庫
可以將遠程倉庫放在首位,以便Maven優先下載鯤鵬平臺jar包。由于鯤鵬Maven倉只放了arm相關jar,所以jar不全,可以配置第二個Maven遠程倉,當鯤鵬maven倉搜索不到時,會自動搜索下一個maven遠程倉庫。
配置方法
1,
${maven.home}/conf/settings/xml
2,
profiles標簽下增加鯤鵬Maven倉
鯤鵬Maven倉庫軟件構建流程
鯤鵬Maven軟件構建關鍵流程:直接從鯤鵬遠程倉下載ARM依賴文件,無需重新編譯依賴文件
查詢本地倉庫-->(優先搜索鯤鵬倉)從鯤鵬遠程倉下載,并保存到本地倉庫-->構建軟件包-->Dependency工具掃描依賴庫-->若不存在x86依賴,結束-->存在x86依賴,下載依賴源碼,在鯤鵬上重新便宜并替換本地倉,再次執行構建
Hive編譯
以鯤鵬論壇hive 2.6.3為例子 https://bbs.huaweicolud.com/forum/therad-41221-1-1.html ?此工程多個jar包含x86架構so,而此部分jar包已經過適配并上傳到鯤鵬倉,編譯時只需優先搜索鯤鵬maven倉。
鯤鵬Maven倉編譯Hive
1,安裝OpenJDK 2,安裝Maven并配置鯤鵬Maven倉 3,Hive編譯
安裝OpenJDK和Maven參見 https://bbs.huaweicloud.com/forum/thread-41221-1-1.html
(Datanucleus為hive pom.xml配置的遠程倉庫,central為maven默認遠程倉)
軟件包遷移
熟悉rpm軟件包重構流程
使用Proting Advisor開發工具自動將 x86 rpm軟件包遷移到鯤鵬平臺
常見linux發行版主要分為兩類:類RedHat系列和類Debian系列。
類RedHat系統中,軟件包的格式是rpm;
類Debian系統中,軟件包的格式是deb。
類RedHat系統提供了rpm(全稱是:RedHat package Manager)命令來安裝,卸載和升級rpm軟件包;類Debian系統提供了dpkg命令來安裝,卸載,升級deb軟件包。
類RedHat
發行版: Fedora/Centos ? openSUSE/SUSE ? Mandriva Linux/Mageia
手動安裝命令: rpm
自動安裝命令: yum zypper urpmi
軟件包后綴: ?*.rpm
類Debian
發行版 Debian/Ubuntu
手動安裝命令: dpkg
自動安裝命令: apt-get
軟件包后綴: *.deb
rpm軟件包組成(應用程序 rpm軟件包文件組成 二進制和庫文件)
應用程序 :常見的開發語言有C C++ Java,Python等,最終編譯成應用程序,應用程序主要包括(二進制文件,庫文件/Jar,配置文件,幫助文件等)
rpm軟件包文件組成:rpm可以將應用程序打包,所以rpm包通常包含以上文件(二進制文件,so庫文件配置文件,jar包等)
二進制和庫文件:rpm包中與處理器框架相關包括二進制(執行文件),庫文件(所以將x86的rpm包重構到Arm的rpm包,需將rpm包含有x86的so,二進制文件,替換成arm框架so,二進制文件)
鯤鵬rpm包的獲取渠道
1,操作系統本地源
2,操作系統遠端源
3,華為云鯤鵬鏡像(華為云提供基于CentOS的華為鯤鵬軟件倉庫,主要包含已遷移過的大數據,WEB,分布式存儲,數據庫等rpm,倉庫地址上面也寫有 https://mirrors.huaweicloud.com/kunpeng)
4,x86 rpm重構(部分軟件包只發行x86架構rpm包,rpm包內可能包括x86平臺依賴文件,不能直接在鯤鵬上直接使用,需要重構)
5,下載源碼編譯
rpm重構流程
將x86 rpm包重構成鯤鵬rpm包流程:
第一階段(掃描):工具掃描x86 rpm識別x86依賴文件
第二階段(編譯):1,是jar依賴文件,從鯤鵬軟件倉是查找,或鯤鵬上重新編譯 2,是so或其他二進制依賴文件,鯤鵬上重新編譯
第三階段(打包):1,解壓x86 rpm包并將x86依賴文件替換成第二階段鯤鵬Maven倉查找到的文件或鯤鵬上重新編譯的文件 2,重新打包
第四階段(驗證):1,重新掃描,確認是否還有x86依賴文件 2,安裝驗證
掃描:掃描x86 rpm,識別x86架構依賴文件
1,下載x86軟件包,(下載x86 rpm軟件包到 /opt/depadmin目錄下)
2,Dependency Adviosr工具掃描(包含哪些依賴文件,架構)
編譯:鯤鵬上重新編譯x86依賴文件
優先從鯤鵬Maven倉上查找依賴文件-->若在鯤鵬Maven倉沒找到,在鯤鵬上重新編譯依賴文件
1,部分jar包已編譯好放在鯤鵬maven倉,可以直接下載,減少重復勞動(查找路徑https://repo.huaweicloud.com/repository/kunpeng)
2,對于so,二進制文件或無法從Maven倉上找到的jar文件,需要在鯤鵬上重新編譯
(1,打開鯤鵬小智網址 https://ic-openlads.huaweicloud.com/chat/#/
2, 輸入依賴文件名,根據提示搜索移植指南
3,如果未找到移植指南,根據源碼提問提示編譯)
打包:(鯤鵬上重新生成rpm包)生成sepc文件-->解壓x86 RPM-->替換x86依賴文件-->打包
1,生成spec文件
執行rpmrebild -s xxx.spec -p xxx.rpm得到rpm包對應的SPEC文件
修改spec文件中的x86相關字段改為aarch64(noarch, x86_64字樣均修改為arrch64),如果spec文件中包含了GLIBC版本信息,需要將GLBC版本修改為GLIBC2.17 ?(CentOS 7.6)
將spec文件拷貝到/root/rpmbuid/SPECS目錄
2,解壓x86 rpm
執行rpm2cpio xxx.rpm | cpio -dim解壓PRM包,
3,包替換x86 依賴文件
將編譯好的組件替換掉RPM包中對應文件
4,打包
在/root/rpmbuild/BUIIDROOT目錄新建rpm包名稱目錄
將解壓和替代的完整包內容拷貝到/root/rpmbuild/BUIIDROOT目錄下
rpmbuild --bb --noclean /root/rpmbuild/SPECS/xxx.spec
5,驗證
重新掃描,確認是否還有x86依賴文件-->安裝驗證
1,重新掃描,確認是否還有x86依賴文件
重復掃描階段工作,通過具體檢測生成的rpm文件是否還包含含有x86依賴文件,如果還存在,繼續后面的編譯和打包操作,知道不存在x86依賴文件
2,安裝驗證
rpm -ivh xxx.rpm 確認是否能安裝成功
運行服務
鯤鵬開發套件Porting Advisor
智能計算開放實驗室:http://ic-openlabs.huawei.com/openlab/
鯤鵬開發套件Porting Advisor: https://www.huaweicloud.com/kunpeng/software/portingadvisor.html
應用遷移
信息收集-->軟件棧分析(兼容性)-->遷移準備(分析掃描工具,代碼遷移工具,性能優化工具,工具問題反饋)-->遷移調優(遷移指導書,調優指導書,鯤鵬論壇,鯤鵬小智(機器人))-->軟件認證(認證流程,認證申請指導,測試用例,測試報告模板,認證結果查詢)
Porting Advisor 工具實現遷移自動化
Porting Advisor 工具實現了自動掃描,自動從鯤鵬Maven下載依賴文件,自動打包功能
第一階段(掃描)
工具掃描x86 rpm識別x86依賴文件
第二階段(編譯)
1,是jar依賴文件,從鯤鵬軟件倉是查找,或鯤鵬上重新編譯 2,是so或其他二進制依賴文件,鯤鵬上重新編譯
第三階段(打包)
1,解壓x86 rpm包并將x86依賴文件替換成第二階段鯤鵬Maven倉查找到的文件或鯤鵬上重新編譯的文件 2,重新打包
第四階段(驗證)
1,重新掃描,確認是否還有x86依賴文件 2,安裝驗證
遷移實例
環境在變:TaiShan 200服務器 cpu:kunpeng920 操作系統CentOS7.6 遠程hhs或者putty等登入工具已經在本地登入登錄
安裝3個依賴軟件
安裝rpmbuild
#yum install rpmdevtools
#rpmdev-setuptree
安裝rpmrebuild
#mkdir rpmrebuild
#cd rpmrebuild
#wget https://sourceforge.net/projects/rpmrebuild/files/rpmrebuild/2.14/rpmrebuild-2.14.tar.gz
#tar xvfz rpmrebuild-2.14.tar.gz
make; make install
安裝rpm2cpio:CentOS 7.6自帶,無需安裝
安裝Porting Advisor
https://www.huaweicloud.com/kunpeng/software/dependencyadvisor.html下載安裝。
Porting Advisor快速構建rpm包流程
x86 rpm在鯤鵬平臺構建 :下載x86軟件包-->構建
1,下載x86軟件包
下載x86 rpm軟件包到 /opt/portadv/portadmin目錄下(portadmin為登入用戶名)
2,重構
登入Porting Advisor,進入“軟件分析構建中心”
輸入下載的軟件包名
點擊“構建軟件包”
如果構建成功,工具會彈出成功提示;如果構建失敗,根據工具提示執行操作。
軟件分析構建中心實例
1,下載x86軟件包
#cd /opt/portadv/portadmin
#wget "http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos7/3.x/BUIDS/3.1.0.0-78/knox/knox_3_1_0_0_78-1.0.0.3.1.0.0-78.noarch.rpm"
2,重構
porting-advisor軟件分析構建中心輸入"knox_3_1_0_0_78-1.0.0.3.1.0.0-78.noarch.rpm",點擊“構建軟件包”
實操部分
基于鯤鵬開發套件實現java代碼遷移實操
可以通過華為云沙箱實驗室 https://lab.huaweicloud.com/experimentalStudy.html?course_id=netty-praxis-cn-east-3&test=439&again=0
或在自己的虛擬機上操作
自己的虛擬機上操作的話,環境要自己配置xfce遠程登入工具或putty需自行下載
鯤鵬開發套件實現java代碼遷移基于華為云,使用xfce登入,登入華為云部分自己省略
首先我登入xfce
假如公有地址192.168.1.1 私有地址192.168.1.10
云服務器的彈性公網IP地址可以通過點擊“控制臺”->“服務列表”->“計算”->“彈性云服務器ECS”進入服務器列表,復制公有地址。
接受秘鑰輸入“yes”,回車;
輸入密碼:3(輸入密碼時,命令行窗口不顯示密碼,輸完之后直接鍵入回車)
#LANG=en_us.UTF-8 ssh root@192.168.1.1
登入成功
下載“dependency advisor”工具分析jar依賴。
wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/netty-praxis/Dependency-advisor-Kunpeng-linux-1.1.3.tar.gz
注:如果是自己的虛擬機直接輸入wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/netty-praxis/Dependency-advisor-Kunpeng-linux-1.1.3.tar.gz 是無效的
需要先安裝命令如 linux安裝解壓zip命令: yum install unzip? wget命令安裝: yum -y install wget ?? linux安裝tar命令:yum install -y tar
等待下載完成即可
解壓并安裝web版的工具 tar zxvf Dependency-advisor-Kunpeng-linux-1.1.3.tar.gz && cd Dependency-advisor-Kunpeng-linux-1.1.3 && bash install.sh web
執行過程中,回車3次
安裝完成
新建網站輸入https://IP:8082? 將ip替代自己的公有iP地址即可? 如https://192.186.1.1:8082 ? ? ? 192.168.1.1已刪除
初始用戶名depadmin? 初始密碼Admin@9000
分析成功的頁面
安裝OpenKDK:
mkdir netty-4.1.34 && cd netty-4.1.34 && wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/netty-praxis/OpenJDK8U-jdk_aarch64_linux_hotspot_jdk8u242-b08.tar.gz
解壓
tar -zxf OpenJDK8U-jdk_aarch64_linux_hotspot_jdk8u242-b08.tar.gz
創建/opt/tools/installed/文件夾
mkdir -pv /opt/tools/installed/
將解壓的移動到 /opt/tools/installed/目錄下
mv jdk8u242-b08 /opt/tools/installed/
編輯配置文件
vi /etc/profile
在最后添加一下代碼
export JAVA_HOME=/opt/tools/installed/jdk8u242-b08
export PATH=$JAVA_HOME/bin:$PATH
按ESC鍵
:wq
保存并退出
下一步安裝Maven
wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/netty-praxis/apache-maven-3.6.3-bin.tar.gz
注:如果是自己的虛擬機直接輸入wget? ***是無效的
需要先安裝命令如 linux安裝解壓zip命令: yum install unzip? wget命令安裝: yum -y install wget ?? linux安裝tar命令:yum install -y tar
解壓安裝包
tar -zxf apache-maven-3.6.3-bin.tar.gz
移動到/opt/tools/installed/目錄下
mv apache-maven-3.6.3 /opt/tools/installed/
替換Maven倉庫配置命令wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/netty-praxis/settings.xml && rm -rf ?/opt/tools/installed/apache-maven-3.6.3/conf/settings.xml &&cp settings.xml /opt/tools/installed/apache-maven-3.6.3/conf/
有提示覆蓋文件輸入“y”回車就行
編輯配置文件
vi /etc/profile
在末尾加入以下代碼
export MAVEN_HOME=/opt/tools/installed/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH
輸入命令配置生效
source /etc/profile
安裝apr-1.6.5
wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/netty-praxis/apr-1.6.5.tar.gz
解壓安裝包
tar -zxf apr-1.6.5.tar.gz
開始編譯
./configure
安裝apr-1.6.5
make -j20 && make install
安裝成功
編譯配置環境
下載自動化腳本
cd /root/netty-4.1.34/ && wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/netty-praxis/set_netty_conf.sh
執行自動化配置腳本
sh set_netty_conf.sh
執行成功
編譯netty-tcnative-parent-2.0.22.Final
cd /root/netty-4.1.34/netty-tcnative-netty-tcnative-parent-2.0.22.Final/
mvn install -DskipTests
等待10分鐘左右
編譯netty-4.1.34-Final
執行解壓并進入netty-4.1.34.Final
cd .. && tar -zxvf netty-netty-4.1.34.Final.tar.gz && cd netty-netty-4.1.34.Final
開始編譯netty-4.1.34.Final
mvn install -DskipTests
等待幾分鐘
編譯成功
驗證編譯結果
切換到編譯結果/root/.m2/repository/io/netty/netty-all/文件夾目錄下
cd /root/.m2/repository/io/netty/netty-all/
解壓netty-all-4.1.34.Final.jar
jar -xvf 4.1.34.Final/netty-all-4.1.34.Final.jar && ls
進入META-INF目錄,查看netty-all-4.1.34.Final.jar結構。
基于鯤鵬Maven倉進行Maven軟件構建 在另一篇博文
遷移學習 鯤鵬
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。