信创活力源于更强算力,合理迁移调优才能发挥更强实力

凯强

2020 年 7 月 21 日

信创活力源于更强算力,合理迁移调优才能发挥更强实力

2020 年是 5G 落地和发展的一年,也是信创产业十分关键的一年。在信息化应用创新的道路上,万物智能可谓必经之路,其不仅能够推动产业升级转型,还能提升各家企业服务效率,为应用创新注入源动力。但是智能化路径却并不是那么容易走通的,尤其是在算力层面。智能升级不仅依赖于网络和算法,还依赖于算力。网络从 4G 升级到 5G,可以迅速提升接入设备数量和连接速度,降低时延,但是算力升级却并不容易。企业整体业务架构在智能化过程时,为了解决算力难题往往要大费周章。而且即便迁移到更强的算力平台,如果不能及时将业务架构与新的算力平台进行匹配优化,最终算力提升效果也很难达到理想状态。


由此可见,想要在信创过程中实现突破,便需要在迁移时找到合理的方法,并及时进行合理的应用调优,方能真正的实现高效智能化。在 7 月 11 日,华为在全国 18 城的鲲鹏创新中心举办了开发者创享日系列沙龙活动,各大沙龙的主题都瞄准了应用代码迁移与性能调优。在全国信创产业的核心地区之一,上海站的活动中显得格外惹人注目。此次活动中,来自华为的鲲鹏计算专家对于迁移过程中的技术路径和不同编程语言的迁移难题进行了深入解读,同时针对迁移过程中的软硬件性能调优及案例进行了详细演示。帮助更多开发者体验到鲲鹏架构迁移的独特优势。


信创产业推进,迁移也有捷径


为加快推进行业信创建设,金融、能源、电力、电信、航空航天、交通、医疗、教育等八个重点领域成为了信创试点领域,而上海也被确定为金融系统信创试点城市。上海的金融产业发达程度本就冠绝全球,而在金融系统信创方面自然也不能落后。


作为信创业务的推动力之一,华为在上海建设鲲鹏生态建设中心,对双方而言都是一种帮助。首先,上海被打造国际经济、金融、贸易、航运和科技创新五个中心,有利于鲲鹏技术的实践落地;第二上海是国际化大都市,政府及交通、教育、医疗等重点行业的信息化都走在全国前列,人才济济更能帮助鲲鹏生态的建设;第三,上海作为长三角一体化发展的龙头,其未来的发展前景不可限量。综上来看,华为在上海建立鲲鹏创新中心,能够打造出面向长三角、国家重点领域及海外复制推广的成功案例,同时也能推动上海的信创产业稳步提升。


软件迁移路径概述


产业提升离不开算力的提升,而算力升级便需要进行软件迁移。相信大多数开发者都理解程序的执行过程。计算机由软硬件组成,底层通常由晶体管和物理材料构成微架构,上层是应用程序、算法等二进制机器码,而中间一层则便是指令集架构。但问题在于,在不同的平台上,指令集是存在明显差距的。



软件迁移的过程主要包含了迁移准备、迁移分析、编译迁移、性能调优以及测试与认证五个关键步骤。



迁移准备:主要是进行软硬件信息的收集,其中包括了用来进行 x86 服务器匹配硬件信息,操作系统、虚拟机、中间件、编译器、上层依赖的开源软件、商业软件、业务软件等软件栈信息。


迁移分析:对收集到的信息和三类软件栈做初步分析和工作量评估。自研软件需要注意语言类型差异,编译型语言需要重新编译之后才能运行在新环境上,解释型语言来则只需要更好虚拟机;开源软件可以直接使用下载在 ARM 上已经被编译好的安装包即可,不支持的话可以自行下载原码编译;商用软件可以通过联系厂商获取它对应 ARM 架构下软件版本,如果没有则可以寻找类似开源软件替换。


编译迁移:主要包括了两部分。自研软件相关迁移如果以解释性语言为主,则应用代码不需要迁移,但是如果是 C/C++ 等编译性语言,需要重新进行编译;软件包迁移时,需要先要扫描该软件包是否存在依赖库或者依赖的可执行程序,同样 C 语言写的是需要重新编译的,编译之后重新把软件包打包,迁移完成后则可以对整体功能进行验收,迁移到此告一段落。


性能调优:迁移完成并不意味着大功告成,在性能调优时首先要建立调优标准,针对当前组网环境和逻辑架构设计新的目标;然后对软件进行压力测试,同时要记住变化,分析压力测试下各种数据指标,对单一指标进行优化;然后继续压力测试,检验优化是否达到效果,及时固化或回退,循环该过程从而实现调优。


测试与认证:主要有功能方面、性能方面和长稳以及安全类内容,保障软件能够达到商用水准后,即可规模上线。然后便可以进行软件和系统到鲲鹏上做鲲鹏展翅认证,扩展应用的软件使用空间并加入鲲鹏生态。截止 6 月 5 日,累计有 809 家行业伙伴已经获得鲲鹏展翅论证。


C/C++的迁移


由于向量差异,指令集差异以及向量寄存器差异的原因存在,编译型语言如 C/C++/Go 等语言,其所开发的程序从 x86 处理器迁移到鲲鹏处理器时,必须经过重新编译才能运行。从源码到程序的过程大体需要源码需要由编译器、汇编器翻译成机器指令,再通过链接器链接库函数生成机器语言程序。



举例来看,在 test.c 的源码文件迁移时,先要经过预处理,把代码里面以 # 号开头的代码片断编译为预处理文件,再经由编译生成汇编代码。经过汇编器生成目标文件也就是机器码,然后联接动态库或者静态库来最终生成可执行文件。


C/C++代码工程主要包括两类文件,编译构建脚本和 C/C++源码。编译构建脚本来需要移植的主要是编译选项,如指定数据类型、生成代码特性、目标执行器架构、处理器硬件加速功能等;C/C++源码类文件需要移植的则包括了编译宏、编译器自带 builtin 函数、内联汇编以及 SSE intrinsic 函数。



编译构建脚本移植的流程大体如上所示,在获取源代码之后,选择所需的编译环境,安装编译器 gcc 等;根据源码的编译脚本生成 Makefile 文件,再用 Makefile 编译生成可持续文件;担任如果代码之中有依赖 x86 平台的 SO 库,那么这部分的依赖库是需要重新编译替换的;在编译完成之后进行安装部署,然后便可以进入到实际的系统中进行测试了。


C/C++源码类文件移植时需要注意迁移过程中年的各个移植项。比如编译宏移植时,gcc 编译器所自带的 x86 编译选项就是 x86_64,对应到鲲鹏平台上是 aarch64,对编译宏下的代码需要机箱内对应的移植;SSE Intrinsic 函数移植时,会涉及到大量的向量化预算加速技术,如果有类似开源工程可以直接应用,能够节省很多力气。


适当性能调优,迁移事半功倍



作为一个几十年从未变过架构,冯·诺依曼架构主要有四大调优方向,CPU 及内存、磁盘、网卡以及应用。


CPU 和内存的优化主要可以分为硬件优化和软件优化。硬件优化又可以分为硬加速和软加速,硬加速在加解密、解压缩、大数据运算和 EC 上进行了优化,软加速又分成单核加速和多核加速,单核在编译方面进行了优化,多核则主要是在 NUMA-Aware 亲和性优化。



软件优化主要集中在编译层面,优化主要涉及四个方面:指令流水布局的优化、内存布局的优化、循环优化、除法优化。JDK 的优化主要是采用了 JIT 编译优化、GC 内存回收管理优化提升内存,在 JVM 循环方面采用向量化、序列化技术,提升程序执行性能。



磁盘调优的有三种优化方向:文件预读,脏数据刷新,IO 调度算法和选择。磁盘有一个磁盘缓冲区,读取调用时会先读到磁盘缓冲区,再读到操作系统和文件系统,最后到内存,关键路径就在文件系统中。经过调优后,CFQ,DeaDLine、NOOP 等适合固态硬盘的场景都有三种数据刷新,如果磁盘预取可以充分利用磁盘带宽,因为使用过的数据可以很快会被使用,使用过的数据相邻的数据也可以很快被使用。


网卡调优主要是在收到网络请求时,其会带来一个包由网卡告知 CPU 并处理,如不能处理完再返回。然后推给网卡驱动,然后产生一个硬中断,其会占用大量 CPU 时间线,产生性能损耗。通过调整网卡中断聚合,在低时延和高吞吐取平衡点以实现调优。


应用优化,鲲鹏平台的优势在于核数比较多,处理并发量比较高的程序有天然优势。但高并发并不容易处理,一旦并发增加,部分公共数据要加锁时,并发加锁会导致多个线程抢占一个锁,就容易出现性能损耗。此时便可以针对这种情况进行代码优化,实现无锁编程,或者把大锁编程小锁,实现高性能原子操作,不会触发上述情况,这三类处理方式均可实现性能提升。



总结来看,在性能调优的四个方面还有其他的一些小技巧,比如 CPU 和内存优化时,可以通过调整内存页大小,CPU 预取,修改线程调度策略实现提升;磁盘优化方面,脏数据刷新、异步文件操作(libaio)以及文件系统参数调整都可以有一些效果;网卡可以利用网卡多队列、开启网卡 TSO、开启网卡 CSUM 实现优化;应用层面则能够利用优化编译选项、文件缓存机制、缓存执行结果、NEON 指令加速等让系统运行更加流畅。


信创之路,大赛起航


鲲鹏对信创行业的赋能是全方位的,其不仅给了企业更多的机会,也为开发者提供了一个展现自己的舞台。为了鼓励开发者基于鲲鹏计算技术,打造各类软、硬件解决方案,实现技术与商业创新,为鲲鹏客户带来更多高价值应用产品与解决方案,华为联合全国各地鲲鹏创新中心面向开发者举办了鲲鹏应用创新大赛。



本次比赛主要面向企业参赛者,同一家企业允许多个不同解决方案团队报名参赛,参赛作品要在 8 月 7 日作品提交截止时间之前完成鲲鹏认证流程的发起,并完成兼容性测试并在线输出测试报告与参赛作品一起提交,便可以与各路强手共同争夺以下奖励。



除了现金奖励之外,大赛对获奖企业和获奖个人选手还有额外的奖励,决赛获奖企业将获得“联合举办专场鲲鹏技术沙龙”的机会;而决赛获奖赛队选手还将优先推荐为“华为云 MVP”,提供技术沙龙发言机会,树立个人品牌。如果你想要与各位大神同台竞技,感受鲲鹏的别样魅力,那么便赶快点击链接报名参赛吧!


https://competition.huaweicloud.com/information/1000041275/introduction?track=110


2020 年 7 月 21 日 20:57258

评论

发布
暂无评论
发现更多内容

对待一件事,从不喜欢再到喜欢,转变需要多大

良知犹存

程序人生

SpringCloud(Netflix)-技术专题-微服务入门介绍

李浩宇/Alex

360 Atlas生产环境使用心得

心平气和

MySQL 分库分表 Proxy Atlas

在龙门吊上,看到破浪而来的智能时代

脑极体

范型的下一步

申屠鹏会

golang 翻译

TCP/IP学习(1):创建套接字

申屠鹏会

TCP 网络 TCP/IP

深挖502和504

书旅

nginx 服务器 HTTP 状态码

跟我一起基于 Karma 搭建一个测试环境 (中)

Jack Q

前端进阶训练营 Karma 测试框架搭建

gRPC在Spring Cloud中的应用

xcbeyond

Java gRPC SpringCloud

老张「原创小说」

瓜藤老祖

个人成长

TypeScript 设计模式之观察者模式

pingan8787

typescript 前端 设计模式

Linux后台开发高频题目总结

我是程序员小贱

troubleshoot之:GC调优到底是什么

程序那些事

性能分析 jvm调优 GC调优

计算机网络基础(十九)---传输层-TCP的拥塞控制

书旅

TCP 协议栈 网络层

为什么你做的 Excel 表不好用?

Tony Wu

效率工具 产品设计 Excel ER图

平时开发Git常用的小技巧

zui.zhang

git rebase

瀑布模型总结

我是程序员小贱

webbench源码阅读

我是程序员小贱

TOGAF认证不只一个,您考的是哪个?

周金根

翻译:如何编写Golang代码(How to Write Go Code)

申屠鹏会

golang 翻译

学习总结 -- Week 10

吴炳华

直播技术的背后--RTMP协议

soolaugust

直播 RTMP

Spring Boot Actuator微服务服务监控

xcbeyond

Java 微服务 springboot actuator 服务监控

k8s-client-go源码剖析(一)

LanLiang

go 开源 Kubernetes 容器 源码剖析

误执行 rm -fr /*,我删删删删库了,要跑路吗?

小林coding

Linux 程序人生 Shell linux命令

突破内存限制的高性能排序

架构师修行之路

Newbe.Claptrap 框架如何实现在多种框架之上运行?

newbe36524

Docker 云计算 微服务 .net core ASP.NET Core

从根上学习Git

书旅

git 工具 版本控制 版本管理工具

二叉树的遍历(前序、中序、后序)

申屠鹏会

golang 算法 二叉树

今天给二叉树加个BGM,二叉树唱歌了!

我是程序员小贱

为什么使用Portainer,而不是Docker CLI来管理Docker环境

xcbeyond

Docker 运维 Portainer

信创活力源于更强算力,合理迁移调优才能发挥更强实力-InfoQ