鲲鹏软件迁移学习笔记(理论部分加实操作 上)
分为理论和实操部分
理论部分
鲲鹏软件迁移概述
鲲鹏软件迁移,处理器指令集的差异,使得原来运行在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 是无效的
需要先安装命令如 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 ***是无效的
需要先安装命令如 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
解压安装包
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软件构建 在另一篇博文
- 点赞
- 收藏
- 关注作者
评论(0)