鯤鵬軟件遷移學習筆記(理論部分加實操作 上)

      網友投稿 1726 2022-05-29

      分為理論和實操部分

      理論部分

      鯤鵬軟件遷移概述

      鯤鵬軟件遷移,處理器指令集的差異,使得原來運行在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小時內刪除侵權內容。

      上一篇:RAFT 論文中文翻譯(1)
      下一篇:Windows 消息機制淺析
      相關文章
      亚洲国产午夜中文字幕精品黄网站| 一本色道久久综合亚洲精品蜜桃冫| 亚洲熟妇成人精品一区| 亚洲精品亚洲人成在线观看麻豆| 亚洲ⅴ国产v天堂a无码二区| 亚洲VA中文字幕无码一二三区 | 亚洲jjzzjjzz在线观看| 亚洲嫩模在线观看| 亚洲综合精品一二三区在线| 亚洲综合视频在线| 亚洲视频精品在线观看| 亚洲欧美在线x视频| 久久无码av亚洲精品色午夜 | 亚洲国产精品无码久久久秋霞1| 最新亚洲卡一卡二卡三新区| 亚洲天然素人无码专区| 亚洲大尺度无码无码专线一区 | 亚洲免费视频网站| 亚洲精品成人网站在线播放| 亚洲成在人线中文字幕| 亚洲毛片基地4455ww| 亚洲私人无码综合久久网| 久久久久久亚洲av无码蜜芽| 五月婷婷亚洲综合| 久久久久亚洲AV无码专区桃色 | 亚洲欧美中文日韩视频| 亚洲AV无码AV男人的天堂不卡| 日本亚洲中午字幕乱码| 亚洲乱亚洲乱少妇无码| 亚洲精品中文字幕无码蜜桃| 亚洲成人中文字幕| 亚洲免费在线视频播放| 亚洲人成网站在线播放2019| 少妇亚洲免费精品| 久久激情亚洲精品无码?V| 国产V亚洲V天堂无码| 久久久久亚洲AV无码专区首JN| 亚洲一区二区三区不卡在线播放| 亚洲依依成人亚洲社区| 亚洲av无码乱码在线观看野外| 亚洲日韩久久综合中文字幕|