从处理器到操作系统,新基建下全面重塑算力生态
狄更斯说:“这是最好的时代,也是最坏的时代。”这句话用来形容2020年再贴切不过。
国产5G、云计算、大数据、人工智能、区块链技术迅速腾飞,与此同时,它们也将作为新的基础设施支撑中国数字经济发展新的动能。新基建时代到来的时刻,我国计算生态却并不十分乐观,传统的计算基础设施所需的成本投入却居高不下,芯片产品的竞争力也还不能完全适配市场需求,国际巨头常年盘踞让随其伴生的软硬件生态同样难以撼动,中国科技的繁荣景象之下其实暗藏杀机。
在尖端技术赶超而底层支撑不足的情况下,要打破现有生态路径和生态体系,为国产技术持续高速发展护航,我们就要重塑属于自己的强算力生态,要打造能够支持国产化的操作系统、虚拟化软件,要能能造出中国桩,制出中国芯,建设出完善的新型算力基础设施。
这件事情,华为一直在做。多年来华为致力突破传统的老的计算框架和计算平台,打造一个全新的全栈计算框架,在对计算生态而言最为关键的软件上,华为也在不断通过操作系统开源、数据库开源、数据虚拟化引擎的开源,来支撑软件伙伴打造商业化的解决方案。
硬件开放、软件开源、使能伙伴是华为构建鲲鹏生态始终坚持的信条。从开放鲲鹏处理器到开源openEuler操作系统,华为坚持从“芯”到“魂”全面出击。在DevRun开发者沙龙——鲲鹏开发者嘉年华上,华为现场为开发者分享了“鲲鹏迁移”和“openEuler”的相关技术原理、实践经验和对应方法论,蓄力新生态下算力提升。
1.鲲鹏软件迁移
为什么要进行软件迁移
计算机是由软件和硬件组成的,要执行软件层的应用程序,就需要底层CPU支持由汇编器形成二进制的机器码(由指令和数据组成)去运行。因此就需要底层计算平台能够支持该CPU的指令,对于不同的处理器而言,它们能够支撑的指令也大不相同,这也是在x86和鲲鹏编译的区别之处。
通过上图左侧中的代码示例,我们可以看到,在x86和鯤鹏上编译之后的指令有三点差异,首先是汇编不同,x86上使用了两条mov指令,鯤鹏上则是通过两条ldr指令、一条add指令以及一条str指令完成了整个过程;其次是指令长度不同,x86上mov指令是24位的,ldr指令是16位的,在鯤鹏上则都是32位;第三则是寄存器不同,x86和鲲鹏处理器使用的向量寄存器不同,其向量指令级也存在差异。
正是因为在X86上面和鲲鹏上面使用的指令存在的这些差异,使得在X86上面运行的程序、二进制、动态库这时候需要在鲲鹏上面重新编译去运行,也就是需要软件迁移的原因。
软件迁移五步骤
通过大量项目和经验总结,要实现软件迁移需要以下五个步骤:
1.迁移准备--收集软件栈信息,准备迁移环境
在这个阶段,主要收集硬件和软件信息。硬件方面的信息主要是收集芯片和服务器的型号,从而方便提供配置性能差不多的鲲鹏服务器;其次是收集软件栈信息,主要分为操作系统、虚拟机、中间件、编译器、上层依赖的开源软件、商业软件、业务软件等信息。
2.迁移分析--分析软件栈,指定迁移策略
迁移分析要做的,就是对收集到的信息和软件栈做初步分析,判断是否真正需要迁移,评估迁移的工作量。
对开源软件来说,直接下载在ARM上已经被编译好的包,或者自行下载原码进行编译就可以了。自研软件的迁移则需要注意语言类型的差异,编译型语言需要重新编译之后才能运行在新环境上,不过对于解释型的语言来说只要更换所依赖的虚拟机就可以。对于商用软件,可以通过联系厂商获取它对应ARM架构下的软件版本,如果没有的话就需要寻找有类似功能的软件做替换。此外像运行环境、虚拟机、编译器和操作系统这些也是要进行替换,可以直接去华为云鯤鹏论坛内有软件仓库下载由鲲鹏官方所做的经过验证的版本。
3.编译迁移--软件编译打包,验证基本功能
在这一阶段,涉及到代码迁移和软件包迁移两种场景。对代码的迁移,不同语言要做不同的修改,像C/C++这种编译性语言需要重新进行编译,因为涉及到指令级,跟指令级相关性比较大,所以在编译脚本、代码都需要做出修改,但是对纯解释性语言开发的应用来说,它们的程序代码是不需要修改的。
对于软件包迁移来说,首先需要扫描该软件包是否存在依赖库或者依赖的可执行程序,这些库和可执行程序如果是用C语言写的是需要重新编译的,编译之后重新把软件包打包即可。
4.性能调优--利用五步法优化软件性能
在迁移完成之后需要对性能进行调优,有【建立基准-压力测试-确定瓶颈-实施优化-确认效果】五个步骤。
建立调优基准,该基准根据当前的硬件配置、组网、测试模型来做综合评估,以建立合理的条有目标;其次在调优目标建立后,通过压测工具对软件或系统进行加压,在加压过程中暴露性能瓶颈,确定瓶颈之后对瓶颈进行优化;第四,注意在优化过程中要及时记录,因为优化并不一定是正向的,出现负向优化时需要及时回退;最后在优化措施实施完成后,需要重新启动压力测试工具以确认优化效果。
5.测试与认证--保证商用上线,共建鲲鹏生态
在性能调优环节结束后,需要做一些压力测试、长稳测试,使软件能够达到商用的目标,最后实现规模上线。此外也可以拿软件和系统到鲲鹏上做鯤鹏展翅认证,其可以扩展应用的软件使用空间并能够加入鲲鹏生态。
代码迁移
1.C/C++代码迁移
C、C++、GO都是非常典型的编译型语言,编译型语言所开发的程序从x86平台移植到鯤鹏平台时一般都需要重新编译才能运行。编译构建脚本类文件在迁移过程中,一般会涉及到编译选项的移植,源码类文件会涉及到编译宏,另外可能还会有编译器自带的Builtin函数的移植、SSEintrinsic函数移植等。
在C/C++代码编译构建过程有六大步骤,首先是获取源码,可以通过GitHub等开源社区来获取;其次需要选择所需的编译环境,就是安装编译器gcc等;之后根据源码的编译脚本生成Makefile文件,再用Makefile编译生成可持续文件。如果这部分代码之中有依赖x86平台的SO库,那么这部分的依赖库是需要重新编译替换的。在编译完成之后进行安装部署,之后进入到实际的系统之中进行测试。
2.Java/Python代码迁移
对于Java、Python这样解释性语言写的程序,它们涉及到的迁移与编译型语言大有不同。
从上图中可以看到Java的技术架构和源码运行过程。对Java而言,在实现迁移的过程中,涉及修改的部分首先就是JDK,因为JDK有一些C的代码,而且在JDK层屏蔽了很多跟指令级相关的内容,所以需要对JDK层进行替换;第二个修改点就是SO库,SO库可能是由解释性语言编译的,它们跟指令集的关系十分密切,需要重新编译才能运行;除此之外,还需注意在程序运行中的错误,这类问题或许并非迁移造成,但因为关乎运行性能也需多加注意。
Python的运行过程和Java类似,在编译修改上也是类似的,也是需要从编译环境和SO库两大方面入手修改。环境上推荐使用A32,Python3你也可以通过样本安装,也可以通过源码安装;SO库有多种类型,但对于各种方式的SO库,最后都是对应为一个SO,定义为SO库,需要的步骤也都是一致的,即装配环境、重新编译、重新替换。
3.Maven仓软件构建
对熟悉Java的开发者而言Maven已经不陌生了,我们需要用Maven去管理Java项目。Java程序依赖着它的jar包,而把jar包重新下载编译是十分耗时的,Maven的作用就是把所有的开源软件编辑成一个jar包放在Maven仓库上面,需要时直接在Maven上调用,,这也叫作.jar的依赖管理。
jar依赖的分类有分本地仓库、远程仓库和中央仓库。在构建.jar包的过程中,首先需要查询本地仓库,本地仓库如果找不到就去远程仓找,第三步需要编译实现,并且验证该版本在鲲鹏上是否可用,如果不可用,则需要重新编译这个包,然后替换到本地的仓库,再重新构建,编译出可使用的版本。
但这个过程还是很繁琐的,使用鲲鹏Maven仓则能大大简化这一过程。鲲鹏Maven仓实质就是一个远程仓,里有各种各样适用于鲲鹏平台的jar包,开发效率得到显著提升。也就是说,基于上面的构建过程,在本地仓没有找到合适的.jar包时,就到鲲鹏的远程仓找,下载出来就是在鲲鹏平台可以使用的jar包,无需重复校验、编译,就可以得到一个鲲鹏上可以用的版本包。
4.软件包迁移
rpm就是把应用程序进行打包,在应用程序里面不可避免存在一些二进制或者SO库,它们和C、指令集都密切相关,因此软件包部分也做一些程序编译和替换,实现重新打包可以分为四个步骤。
首先下载X86软件包,利用DependencyAdvisor工具进行扫描。然后再鲲鹏上重新编译X86依赖文件,为了减少劳动,在这一步骤,首先优先从鲲鹏Maven仓上查找文件,如果鲲鹏Maven仓中未找到,则在鲲鹏上重新编译依赖文件。第三步时在鲲鹏上小红心生成rpm包,首先得到rpm包对应的spec文件,然后解压X86rpm,再把包替换成X86依赖文件,最后打包生成新的rpm包。最后一个步骤是验证,需要重新扫描,确认是否还有X86依赖文件,如果存在,则继续编译打包,直到没有X86依赖文件存在。
2.openEuler
在计算多样性的时代,鲲鹏有机组合为业界提供了最强算力的服务器处理器和AI处理器,以满足全栈全场景的不同需求,但从计算产业生态的层面来讲,稳定和强大的操作系统是一切的前提。去年年底,华为操作系统openEuler正式开源,我们的计算世界因此真正地变得既有相似,更有不同起来。
A-Tune
一个系统想要达到性能最优,从底层的芯片到深层的应用涉及到各个方面都需要做调节,特别是像openEuler这样基于宏内核的操作系统,在软件设计的时候更要考虑各方面的场景,保证在大部分的场景下都是通用且有益的。而随着数字化技术的不断升级,新应用、新计算、新架构的出现,调优对象、业务场景数量随之暴增,业务复杂度也直线上升,传统系统调优越来越难以满足当前需求。A-Tune的出现,就是为了降低调优门槛,提升调优效率。
A-Tune的目标
A-Tune自优化的终极目标,是要通过自身充分发挥鲲鹏的硬件和openEuler基础软件性能,释放鲲鹏芯片的算力,降低优化成本。在实现上,A-Tune就是要通过感知上层的业务场景,自动完成调优配置。针对不同的场景,A-Tune需要找到不同的需求,根据相应需求实现自动调优。
A-Tune的技术实现
A-Tune自动调优具备两大关键能力。第一是在运行时自调优,这一能力使用了系统画像技术,基于离线训练好的业务模型,对数据进行采集,再通过聚类、分类相结合的方法,精准识别上层业务,匹配最佳资源模型;第二是面向专业工程师的离线自调优,这需要工程师给一个参数集,并且给业务评价指标,通过反馈式的不断地迭代,再传递到贝叶斯优化算法,最终反馈给工程师最优的参数。
在运行时自调优过程中,用户下发命令后,A-Tune的服务端将采集数据进行负载识别,对上层业务或应用的类型进行识别感知,并在为其匹配合适的资源模型,然后将配置进行下发。这一过程非常迅速,在一分钟之内就可以完成,大大减轻了人工调优的负担。
对于离线自调优,当客户端发送请求信息到服务端之后,服务端将构建一个由形象性能的参数组成的参数集,再把这一参数集传给贝叶斯优化算法,贝叶斯优化算法会返回新的参数,通过不断地循环迭代,得到最优的参数,随后服务端就会把最优的参数返回给用户。
iSulad
从2019年开始,容器迎来了浪潮,大多数的企业开始全面拥抱容器化,容器的规模、密度更加扩大,它的问题和麻烦也随之出现,重新打造一个容器引擎成为一种必然的选择。面对新的挑战,鲲鹏也造出来一个新轮子--iSulad。
为什么要造新轮子?
市面上容器用得很好,为什么我们要重新造一个轮子?这要从三方面说起。首先,随着微服务架构的出现,要求容器启动速度越来越快;第二,节点变得越来越拥挤,当前业务量在激增,而资源结构却没有变化,节点变得越来越拥挤;第三,IoT、边缘计算的兴起也给容器带来了新挑战,运营商和电信领域给边缘计算制定了的新规范,而边缘计算一般情况会选择容器作为部署,新的挑战随之而来。轻量化的容器引擎iSulad就此应运而生,在复杂的挑战之下,为多种场景提供最灵活最稳定最安全的底层支撑。
iSulad轻量级容器实现原理
容器化的实现可以总结成六大原理。第一,它由C/C++语言编写,可以获得更轻的资源消耗。第二,它提供CRI接口,为兼容性的实现提供了保障。第三,它支持OCI镜像,支持平滑替换Docker,开发者无需担心用了这个引擎之后重新准备镜像的问题。第四,它支持包括安全容器在内的各种各样的容器形态。第五,它提供更便捷使用的命令行,能够兼容了大部分的Docker命令。第六,它提供插件化架构,可根据用户需要开发定制化插件。
iSulad的特点
轻、快、易、灵是iSulad的特点。
“轻”是因为iSulad是用C/C++编写的,而且能够改变镜像的组织格式,可在轻量化运行时减少调用链路。这种轻量化运行效果十分显著,和Docker比较,100个容器稳态的时候iSulad下降了68%左右。
iSulad的“快”,体现在容器启动、镜像构建和镜像下载三方面,用函数调用替代Docker容器传统的调用链路缩短了调用时间,隔离镜像的元数据实现了高速并发,支持镜像按需下载提高了镜像拉取速度。
至于“易”,是指实现迁移非常便捷容易。iSulad将提供一个迁移转化工具,在从Docker迁移的过程中,不需要再对本地所有的存储结构做完整的配置就可实现迁移。
最后是“灵”,iSulad有注重资源占用的light模式和注重性能的performance模式两种模式供以选择,支持开发者针对不同场景进行灵活配置。
3.写在最后
技术进步需要优良的产业生态为其护航,在摩尔定律陷入失效纷争的今天,传统计算生态的土地想要以既往姿态为AI、云计算、大数据等领域蓄力,无疑需要一块滋养算力的沃土。从处理器到操作系统,鲲鹏持续发力,而随着新基建时代到来,鲲鹏打造的算力生态,必将成为未来计算共同体的最强基座。
声明:本站转载此文目的在于传递更多信息,并不代表赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本网联系,我们将在第一时间删除内容,本网站对此声明具有最终解释权。