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

网友投稿 1309 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 消息机制浅析
相关文章