鯤鵬軟件遷移微認(rèn)證之學(xué)習(xí)筆記

      網(wǎng)友投稿 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),處理器硬件加速功能等)

      鯤鵬軟件遷移微認(rèn)證之學(xué)習(xí)筆記

      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)容。

      上一篇:【干貨分享】惡意樣本分析手冊——常用方法篇
      下一篇:C 語言代碼風(fēng)格之 Linux 內(nèi)核代碼風(fēng)格
      相關(guān)文章
      亚洲制服丝袜精品久久| 亚洲精品午夜国产VA久久成人| 亚洲不卡AV影片在线播放| 亚洲精品美女视频| 亚洲免费日韩无码系列| 亚洲一区电影在线观看| 亚洲av女电影网| 久久久无码精品亚洲日韩软件| 亚洲无人区码一二三码区别图片| 亚洲天天做日日做天天欢毛片| 亚洲偷自拍拍综合网| 亚洲国产成人精品青青草原| 亚洲色图黄色小说| 亚洲无圣光一区二区| 国产∨亚洲V天堂无码久久久| 亚洲Av无码乱码在线znlu| 在线观看亚洲免费| 亚洲AV男人的天堂在线观看| 亚洲成人激情在线| 亚洲日本一区二区三区在线| www亚洲精品少妇裸乳一区二区| 中文字幕亚洲情99在线| 亚洲日韩AV一区二区三区四区| 91午夜精品亚洲一区二区三区| 亚洲午夜电影在线观看| 亚洲综合校园春色| 亚洲视频在线一区二区三区| 亚洲av无码乱码国产精品| 久久亚洲精品无码播放| 亚洲欧洲国产精品香蕉网| 久久亚洲精品中文字幕无码| 久久亚洲AV无码精品色午夜| 亚洲制服在线观看| 亚洲成a人无码亚洲成www牛牛 | 在线观看亚洲一区二区| 亚洲另类自拍丝袜第1页| 亚洲中文字幕精品久久| 亚洲AV无码乱码在线观看性色扶| 亚洲伊人久久成综合人影院| 亚洲不卡中文字幕无码| 亚洲欧洲日产v特级毛片|