鲲鹏软件迁移学习笔记(理论部分加实操作 上)

举报
QGS 发表于 2021/01/25 21:46:33 2021/01/25
【摘要】 实践操作+理论(基于鲲鹏服务器自己的虚拟机实操在(下篇出))

分为理论和实操部分


理论部分

鲲鹏软件迁移概述

鲲鹏软件迁移,处理器指令集的差异,使得原来运行在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.cn/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.cn/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.cn/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.cn/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.cn/repository/kunpeng)
2,对于so,二进制文件或无法从Maven仓上找到的jar文件,需要在鲲鹏上重新编译
(1,打开鲲鹏小智网址 https://ic-openlads.huaweicloud.cn/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.cn/openlab/
鲲鹏开发套件Porting Advisor: https://www.huaweicloud.cn/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.cn/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.cn/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软件构建 在另一篇博文



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。