上学那会,我就爱看一些武侠、玄幻类的作品,耳濡目染,内心有了一个“中二”的英雄梦。尽管我自认为天赋平平,但内心坚韧,相信默默努力、持续积累,终会厚积薄发,像英雄那样发光发热。
“胜则举杯相庆,败则拼死相救。”这句充满了英雄色彩的话,在我心中勾勒出了华为文化的轮廓——低调坚韧、充满豪情壮志、对准目标凝聚一切力量持续奋斗,这与我心底的追求不谋而合,我渴望成为“共举杯、拼相救”的一员。
一波三折的“死锁”之谜
2014年,我来到杭州,正式开启了在服务器OS(操作系统)团队(现在的EulerOS)的操作系统探险之旅。在校期间学习的都是硬件嵌入式系统,乍一接触更大型的服务器Linux操作系统,还真有点吃不消,这也勾起了我钻研的兴致。在操作系统领域学习,很像一叶扁舟缓慢驶入茫茫之海,我享受新知识源源不断涌入脑海的充盈之感,也对“学海无涯”这个词深以为然。好在我并不是孤舟,团队里的兄弟姐妹们都在一同学习。
我们的PL(项目负责人)晓峰哥,安排小组成员每天晨会上轮流分享操作系统的原理知识,不仅打破了信息壁垒,知识共享,效率翻倍,也点燃了我们对未知的热情。为了能在晨会白板上输出点东西,我更有学习动力,如饥似渴地翻阅原理书。一段时间后,那本又厚又经典的《深入理解Linux内核》,竟然就这样被我啃完了。当然,这么好的培养方式后续也被我传承了下来。
有了原理加持,加上平时问题定位和需求开发的实操,转正时我也算入了门。随后,我成为了存储产品线的接口人,问题、需求一把对接,不分模块和领域,来者不拒。无论是白天的bug攻坚,还是晚上的需求代码编写,都让我感觉很充实,成就感拉满了!技术能力也在以肉眼可见的速度提升,解决的问题涉猎了整个欧拉操作系统各大子系统,我也成为了产品侧眼中的“专家”。
两年后,我迎来了一场硬仗:华为OceanStor Dorado全闪存存储产品技术栈全面用户态化。该存储产品是一款基于欧拉操作系统运行的企业级高性能存储服务器,早年,其存储软件栈为了极致性能全部采用内核态开发,而随着时代发展,存储软件系统的增值特性逐渐增多,内核态的开发效率以及问题定位效率已不足以支撑产品的快速发展。
产品侧决心改变现状,将内核态切换到用户态模式,便必须解决其中的核心难题:自旋锁。业务代码中有数不清的自旋锁同步机制,自旋锁在运行时之所以能时刻保持稳定状态,是基于内核态不可抢占的调度策略,若切换到用户态,其可抢占调度策略则会让任务一跑就死锁,甚至根本无法运行。
当时的LM(资源线主管)范老大把这个难题交给我时,我还不知道即将面对的会是什么。经我判断,若要达成产品侧的目标,得从操作系统底层入手,让用户态和内核态具备一样的抢占机制,同时不能对系统现有机制造成太多冲击。既然有了思路,我立刻投入到调度子系统代码的阅读中,在掌握系统抢占调度的所有时机和流程后,很快给出了一个用户态禁抢占机制的实现方案。
可我将特性推送到产品侧,联合产品代码整体运行时,却出现各种挂死现象,根本跑不起来。产品侧的同事十分焦急,我也有点懵。为了搞清情况,我迅速奔赴产品所在的成都研究所,没想到这便开始了以月为单位的“酸爽”驻场攻关。
调度挂死的问题很难定位,从内核崩溃后的内存数据文件中看不出原因,加入打印调测日志又会冲爆系统,这种情况我是第一次遇到。先整理思路!我立刻在公司内外搜索各种调度领域的案例寻找灵感,浏览多篇文章后,我发现一般都是先通过获取调度轨迹来缩小出现问题的进程任务范围,然后对照小范围任务的代码流程分析、假设、调测印证。我赶紧联合产品侧的兄弟们在产品环境上部署、复现。都说天府之国有许多美食,我是没心思享用了。
所幸,从多次抓取的轨迹中,我对比分析后发现:“挂死”基本集中在两个最频繁执行的任务线程之间。这是一针很提气的强心剂!但还不够,我陷入了更深的思考:“每个任务线程处理的事项很多,具体是哪个位置发生了问题呢?如果是机制有问题,为什么基本都挂在这两个任务上?如果是业务代码有问题,那流程上又是什么导致问题?”
思绪很乱,我趁着上厕所狠狠洗了把脸,回来后,我决定列出所有的可能性,再逐一印证排除,直至找到问题根源。功夫不负有心人,我们详尽分析日志发现:业务代码在进程空间不可切换的地方,调用了一些主动切换或睡眠的接口,直接破坏当前特性的机制,从而引起死锁。发现问题后,我们马上整理了定位报告,并同步提交产品SE(系统工程师)。
我如释重负,回去好好睡了一觉。此时距离我抵达成都已经有段时间了,本以为可以返程回杭州,结果PM(项目经理)一个电话,我又赶回会议室。
“当前用法上的确有问题,但是业务接口层层嵌套,要排查的很多,能不能在底层几个接口直接拦截返回?”
“这几个是系统原生接口,如果返回就改变了语义,未来演进也会有问题。”
“那怎么保证后面开发的代码不会再发生这个问题呢?”
“举一反三,我们是不是可以把这次调测的代码完善下作为DFX(面向产品非功能性属性的设计)特性商用,一旦有新的用法问题,可以快速识别、解决。”
经过大家的努力,团队成功整改了当前问题,同时,我们将双方开发的调测机制纳入DFX需求落入版本,从根本上解决了问题。
这是我第一次参与大特性端到端的开发,一波三折,与产品侧的兄弟并肩作战、日夜攻关,最终成功支撑产品线完成OceanStor Dorado全面用户态化切换。这不仅实现架构解耦,支撑未来快速演进,更提升了产品性能,我也因此荣获公司的“金牌个人”奖。
酣畅淋漓的“江湖决战”
2019年5月,A国将华为列入实体清单,EulerOS作为基础软件底座的自研操作系统,肩负起一项历史性的使命:实现操作系统全面国产化,同时还要具备更强的系统竞争力。
当时,我是EulerOS内核团队的PL,团队负责操作系统内核的核心调度和内存子系统的技术构建,组织给予挑战任务:面向存储产业实现软硬件国产化,并且性能相比X86平台获得提升。时间紧、任务重,我们要和时间赛跑。
高端存储的性能指标主要是IOPS(每秒进行读写操作的次数)和时延,二者受硬件性能、系统调度和访存性能等直接影响。团队兵分两路,一队分析比对鲲鹏芯片与X86芯片的硬件能力,一队分析系统调度和访存瓶颈及提升方案。然后,针对鲲鹏芯片的特点,我们在最大化利用算力的基础上,制定灵活差异化的调度机制方案,同时尽量避免多核并发抢占与远距离的内存访问。
想法很美好,现实很残酷。庞大的代码量,复杂的周边交互,想要有正确的判断,必须全面掌握当前机制、深入骨髓地吃透所有代码流程。我们再次兵分多路,根据代码目录拆分模块后,分工读代码。
那时,我组织大家封闭在一个会议室里集中攻关,画满就擦、擦了又画的白板见证了我们无数次思维的碰撞。午休时间,大家也直接在会议室里小憩,醒了便开始讨论,相互印证补充。其间,我协调了很多产品线的专家过来讲解,帮助兄弟们更好地理解业务流和交互流。终于,我们在一周内形成了完整的代码架构、关键模块、交互关系图等。随后,团队提出了核心调度机制的剥离方案,融合了差异化调度队列、队列无锁化等关键技术,方案串讲时,获得了内外部专家的一致认可。
开发工作紧锣密鼓地推进,大家斗志高昂。杭州研究所和部门的领导时常慰问,带来热腾腾的饺子和甲鱼汤,给我们鼓鼓劲、加加油。有一天晚上,部门领导锋哥专门过来为我们打气,只见他走到大伙中间,深吸一口气,单手稳稳支撑,直接来了十个俯卧撑,兄弟们开怀鼓掌,疲惫瞬间烟消云散。
然而,不出意外的话,马上就要出意外了。内部版本发布过程中,我们测试出一个低概率的系统崩溃问题,经过一周的定位排查未果,商用发布节点迫在眉睫。情况紧急,我担任攻关组长,召集三名骨干联合攻关,迅速锁定直接原因——内存访问异常,且出现两次。“不会遇到‘踩内存’问题了吧!”“踩内存”也就是系统访问了不该访问的内存地址,是最难定位的一类问题,真是怕什么来什么。
倒推时间,我们只有三天,说实话压力很大,但我一直对自己说:“我带的组绝不能拖版本的后腿!”我鼓励兄弟们坚持住,一步步扎实推进。我按照以前攻关的经验,采取“三管齐下”战略:正面分析两个崩溃现场的内存数据、提升复现概率、代码走读找bug。终于,我们发现两次崩溃虽然流程不同,但异常部分都出现了同一个特征值,而且都是内核动态申请的内存,复现用例也缩小了范围,压测一个小时基本可以复现。
这是重大的进展,但距离成功还很远,此时,时间已经过去一天半。
怎么办?那天晚上,我把自己想象成过关的侠客,以耳机为屏,隔绝干扰,重新梳理所有信息,我知道危急关头更需冷静。突然灵光一闪!被踩的动态内存都来自伙伴系统(linux管理内存的基础机制),那很可能动态内存块还在伙伴系统内存池里的时候就被踩了,只是申请使用时触发了异常,我们可以尝试在内存伙伴系统里面设置“只读”来抓,同时在伙伴系统的内存值统一设置特征值,方便判断。
我将想法告诉兄弟们,大家立刻来了精神,在伙伴系统中设置了内存段只读,一旦访问到只读内存系统就会停止运行。但是几个小时后,系统仍然没有什么动静,我们都有点着急,疑惑道:“难道方向错了?”
不甘心,我又打开系统日志观察,惊喜地发现虽然系统没有反应,但是抓到了和当时一样的特征值!说明内存已经被踩,没有触发只读保护,那真相就是:踩内存是系统外的底层造成的。这下柳暗花明了,底层同事顺藤摸瓜,很快找到了bug触发的根因,最终在版本发布前解决了这个大麻烦。
这次攻关,兄弟们经受住了技术、体力、精神的三重考验,高质量达成了挑战目标:孵化了多核差异化调度、内存访问加速等竞争力特性并商用落地到了存储DoradoV6高端产品,助力IOPS性能较X86大幅提升。团队收获了精神和物质的双重激励,我个人也获得了“业务连续性战地英雄”称号。经过这样一次战斗,大家除了技术上有所成长,也第一次体会到打硬仗、打胜仗的非凡感觉,相信以后面对其他挑战时,会更有信心。
中软未来俱乐部合影(作者为第一排右三)
“智取”大内存架构竞争力
攻关解决了公司的燃眉之急,但我们仍需在硬件能力无法持续提升的情况下,通过系统软件持续提升产品竞争力。为了保障产品竞争力持续领先,公司启动了各大攻关,集结各路专家突破重大难题,探求大颗粒的架构性创新。我也随之加入了新的战场,参战到三丫坡攻关、太平洋攻关,主导构筑大内存架构竞争力、协同存储打造数控分离架构演进。
面对新的历史使命,我带领团队开始探索能够支撑产业持续发展的大颗粒技术。当前,内存容量的发展已经跟不上算力的发展,内存的成本占比也越来越高,但是实际业务中内存的利用率还有很大的提升空间,比如内存中的数据有很大一部分是较少访问的冷内存,如果将这些冷内存放置到更低成本的慢速介质上,便可降低内存成本;另外,如果腾出的内存空间让产品跑更多的业务,也能提升性能,这是一个能够带来产品性价比提升的好方向,业界也已经开始尝试。
这个课题很快也被纳入了三丫坡攻关的关键技术,要在ICT各大产品取得实践效果。我们召集好手,说干就干,精准的内存数据扫描与冷热识别、内存高性能淘汰策略等关键技术浮出水面,快速开发完原型代码后,我们先在MySQL(开源数据库)这种通用场景上做了初步验证,相比现有系统自带的数据交互机制提升不少。
随后,我们开始面向产品实际场景做对接验证,存储产品最先对接我们的新技术,但又有难题:产品业务面的数据交换根本不走内核态,而是用户态RDMA(远程直接数据存取),我们当前的实现无法对接他们的业务面,必须有个高性能的用户态通道才能够真正发挥作用。就在我们觉得有点受挫的时候,产品侧却对我们的技术十分期待,产品架构师鼓励我们:“和欧拉合作这么多年,还没有碰到你们解决不了的问题。”
是啊,我们都是战斗着过来的,有啥怕的?不就是再来一次吗,一定可以的!我们接过任务,开始调研用户态数据交换技术、摸底现有业界方案现状、评估性能差距,解决一个个问题和时延拦路虎,最终实现了us(微秒)级的用户态PgFault(缺页错误)通知能力,端到端对接了产品的数据流,实现存储缓存容量成倍扩展,内存明显缩减的效果。随着技术推进,我们的大内存技术也在公有云落地实现内存成本降低,计算OpenEuler外部客户性价比大幅提升等效果,我因此多次获得各产品线的总裁奖,也荣获了第二个公司“金牌个人”奖。
后来,我有幸担任了太平洋攻关的分队长和存储产品的访问学者,在先进工艺不可获得的情况下,协同产品架构师一起打造数控分离架构,摆脱对CPU算力的依赖,持续保持产品竞争力。我负责数控分离架构中构建高性能数据面,保持低底噪高性能的同时,面向未来演进能够屏蔽算力和部署差异,实现业务无感的算力灵活配置以及高利用率。担任访问学者期间,我和产品架构师、专家们多次组织研讨,明确了架构设计以及梯次演进的节奏,完成了关键技术原型的开发,实现极低底噪以及多OS分区部署协同的阶段成果。部分技术已开始沿途落地到商用版本,为产品架构演进奠定基础。
说起来,访问学者机制为我提供了非常多的便利,我能够更方便地深入到产品的技术讨论,获取到更多产品洞察、未来演进方向等信息,帮助我在充分理解产品场景,在内部技术规划时提前做好技术布局;遇到瓶颈时,我还能够吸收产品线各领域专家的经验,打破固有思维实现突破;此外,我也和产品软件平台的管理者、架构师等建立了良好的合作关系和友谊,为后续合作、支撑产品线取得更大成功奠定深厚基础。比如首席架构师小蔡虽然年轻,但在这方面绝对是榜样,他接触新事物,就会反复练习,直到熟练掌握。有一次出差路上,我转头发现他又在琢磨新技能,不由得调侃他赶路还不忘“卷”,他却念念有词:“持续学习、反复练习是很重要的。” 的确,未来之路荆棘丛生,学习上也不能有所懈怠。
写在最后
江湖浩瀚,一路走来越来越发现自己懂的太少,操作系统是个一辈子都学不完的领域,而今新兴的AI技术也在强势崛起,二者的结合有着非常大的想象空间,中软架设部部长胡sir经常引用一句话“苟日新,日日新,又日新”,操作系统这个看似古老而又稳定的领域也不例外,亦需不断淬炼,方能焕发青春。
我辈当保持初心、勤勉不息,继续书写属于我们的历史。
没有抄袭模仿,没学别人,那才让人佩服,有就要承认,别纯血纯血的。国际笑话,谁瞧得起中国人。微软可是你老师,就看礼仪之邦怎么办。
你想跪没人拦着你呀,你随时都可以呀[鼓掌][鼓掌][点踩][点踩][点踩]
欧拉多难使用没点数?你给我年薪50我自然就会
祝贺华为人再创辉煌!衷心感谢你们的默默付出!