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