一、系统软件技术的核心价值与面临挑战
系统软件作为软件架构的基石,扮演着连接软件与硬件的桥梁角色,位于整个软件生态的最底层,处于关键核心的位置。系统软件最为显著的特征在于其规模效应,随着服务器体量的增加,系统软件研发的价值愈发凸显。
首先,系统软件技术能够显著提升服务器资源的利用率,实现翻倍效果,同时性能也能提升30%~50%,从而大幅降低公司的服务器资源成本。其次,专业的系统软件团队能够迅速定位并解决底层技术问题,避免小故障累积成大故障,确保业务稳定运行,降低潜在风险。此外,系统软件还扮演着桥梁的角色,推动着服务器和上层软件的架构持续演进与创新,为公司的技术发展注入源源不断的动力。
然而,随着规模的扩大,系统软件研发也面临着更为严格的挑战和约束条件。特别是在快手这样的背景下,挑战尤为突出。一方面,系统软件团队需要具备深厚的技术底蕴,不仅要深入到底层软件和硬件领域,还要理解上层平台以及业务逻辑,才能与业务团队保持同频共振。另一方面,与行业内的大型企业相比,快手在系统软件研发上的人力和物力投入相对有限。因此,快手需要更加精准地识别并解决公司面临的关键技术问题,在解决关键问题上做到极致,不追求大而全。同时,快手需要站在巨人肩膀上,基于巨人创新突破,避免重复造轮子。
最后,在技术推广方面,快手也面临着不小的挑战。如何将底层技术成果有效地推广至全公司,是一个亟待解决的问题。这需要快手以公司和行业的成本效益战略为指导,紧密结合业务的实际需求,实现与业务的共赢。同时,快手需要降低技术推广的成本,甚至实现对业务的透明化,确保新技术的引入不会给业务带来稳定性和安全方面的隐患。在此基础上,快手还需要保持技术的先进性,不断推动系统软件的创新与发展,为公司的长远发展提供坚实的技术支撑。
二、“四横四纵”架构——快手系统软件技术体系的基石
自2020年初起,快手系统软件技术团队开始进行自研技术的探索,凭借对业务场景需求的深刻洞察及技术趋势的精准预判,成功构建了一套独特的“四横四竖”架构的系统软件技术体系。若将软件体系比作一棵参天大树,系统软件无疑是深植于土壤中的“树根”,它位于软件架构的最底层,既连接着硬件资源,又支撑着上层软件,发挥着承上启下的关键作用。向下做好资源管理和抽象,向上高效、稳定、安全支撑好平台和业务。因此,掌握系统软件技术对于技术人员而言,不仅是深入技术根基的必经之路,也是实现个人持续成长的重要阶梯。
快手的系统软件技术涵盖了操作系统、编译构建、运行时(JVM)、系统诊断、系统观测等多个方向,每一环节都至关重要。其中,操作系统作为最基础和核心的软件,更是我国亟待突破的关键核心技术之一。
- 最上层是Java运行底座——JVM,它为Java应用提供稳定高效的运行环境,是Java生态中不可或缺的一环。
- 紧接着是编译系统层,主要聚焦于C++构建系统与编译技术,确保代码的高效编译与优化。
- 再往下则是操作系统层,作为系统软件的核心组成部分,它负责资源管理、任务调度等关键功能,是保障系统稳定运行的基础。
- 而位于最底层的微架构层,涵盖了CPU微架构与GPU微架构,这一层直接决定了硬件的性能发挥,是技术大树深植土壤的根基所在。
2.1 JVM技术创新:Java 17透明协程与Checkpoint技术
Java作为快手第一大语言,占有资源在千万核级别。面对JDK社区日新月异的发展,尽管新版本在稳定性、性能和功能方面不断优化,但直接使用开源版本在快手的实际应用场景中仍可能遭遇稳定性和性能瓶颈,阻碍了其在生产环境中的广泛应用。同时,快手正积极研发契合自身业务需求的JVM特性,这些特性亟需与上游JDK社区实现深度整合。鉴于此,快手组建专业的JVM团队显得尤为迫切。
在自研JVM的道路上,快手并非从零开始,而是站在巨人的肩膀上,吸取社区、行业新能力的基础上,进行自主创新。
在实践中,快手发现成本优化能全局统筹稳定性、性能和易用性这三个维度,符合公司降本增效的战略。为了极致提升单实例性能,我们从IPC(每周期指令数)、利用率和复杂度降低三个维度入手。同时,为扩大其应用规模,需深入研究各类场景发生的小概率事件,确保JVM的稳定性和易用性。
近年来,快手在JVM领域取得了不少先进的技术成果。作为行业内首个将Java 17超大规模上线的公司,快手还最早大规模应用了ISA-L和弹性内存技术,并研发了首个Java 17透明协程和JVM Checkpoint技术等。
2.1.1 Java 17透明协程
对于编程开发者,传统线程模型逻辑直观但性能受限,而异步模型虽性能高却复杂性大。协程以“同步编程,异步执行”平衡两者,成为现代语言标配。在阿里的Wisp协程基础上,我们进行了两大核心优化:一是重构协程调度,通过引入了就近调度、延迟睡眠、LIFO策略、延迟满足以及线程复用等多种优化手段确保低负载工况下协程的高效执行,解决了低负载场景下利用率高的问题,使协程的覆盖率大幅提升。经此优化,快手协程在低负载工况下的CPU指标不仅解决了利用率比线程高10%的问题,甚至还优于传统线程模型14%。二是通过协程队列与载体线程的分离技术,解决了JNI(Java Native Interface)执行时间长导致的业务延时过长问题,进一步扩大了协程的适用场景。
从这两个问题的解决来看,为了做到上层无感知,JVM需要处理很多复杂的场景,实际上将复杂度下沉到JVM层面,真正做到复杂留给自己,简单留给用户。此外,虽说系统软件有比较好的规模效应,但绝不是简单的复制,比如这里提到大规模落地需要解决很多小规模场景不用解决的问题,另外在扩量的过程中,一些小概率问题变成必然问题,例如在我们所面对的场景中,哪怕是十万分之一概率出现的问题,也需要修复打磨好,这对技术能力提出了极致的要求。
2.1.2 JVM Checkpoint
近期,我们在研发另一项有趣且极具挑战性的技术——JVM Checkpoint。这项技术能将JVM内部的CodeCache、Metaspace等数据快照保存到远程,下次JVM启动可以直接拉起快照,快速运行。从实际应用效果来看,在启用Checkpoint之前,启动时间需要150s,而启用后,启动时间大幅度缩减至80秒,启动速度提升了近一半。此外,启动阶段利用率能从23%降低到5%。这项技术将能大幅度提升应用启动速度,增加弹性能力,大幅减少回滚时间,也能节省启动阶段资源预留成本。值得一提的是,快手系统软件团队始终坚持做难而正确的事,我们提前1-2年进行技术规划和储备,以确保我们的技术始终走在行业的前沿。
2.2 BOLT+AutoFDO等编译技术组合做功,显著提升整体性能
编译器领域的核心使命是为公司提供高性能、稳定、安全且易用的编译技术,其中快手的主要承载产品是KBuild。KBuild助力快手大部分业务编译构建,其价值体现在四方面:研发效率上,通过分布式和缓存技术,KBuild将C++工程编译时间从超1小时缩短至5分钟内,大幅提升团队效率;稳定性上,通过灰度发布控制基础组件,减少代码变更引发的稳定性问题;代码质量上,配备静态扫描机制,发现开发Review阶段难以察觉的问题;性能优化方面,通过编译优化技术降低服务器用量,优化延时提升用户体验。
快手的C++编译优化技术涵盖整个流程,包括编译期参数调优、AutoFDO、链接期LTO优化、链接后BOLT优化及基础库的SIMD、高性能Protobuf、JSON优化等。这些技术不仅应用开源工具,更根据实际需求深度改造。例如,为解决LTO技术增加编译时间的问题,快手引入分布式集群编译和编译缓存技术,使编译时间仅秒级增长。BOLT作为一项先进的链接后优化技术,其核心优势在于通过分析线上运行程序的perf数据来优化二进制文件。而AutoFDO则基于采集的profile数据在编译期进行优化,两者在多个场景下可以协同工作以提升性能。
然而,在快手实际落地过程中,我们遇到了一个挑战:当尝试将BOLT与AutoFDO合并使用时,由于AutoFDO会导致二进制文件发生变化,使得为BOLT准备的profile数据失效,从而无法充分发挥两者的优化效果。为了解决这一问题,快手团队深入研究了最新的Match+Infer方案,并成功在公司的一个业务服务上进行了验证。结果显示,采用该方案后,优化效果从单独使用BOLT时的8%提升至了12%(即AutoFDO+BOLT的组合优化效果)。
快手已大规模应用这些编译优化技术,整体性能提升了10%~13%,同时延时降低了4%~8%,不仅降低了成本,还在业务效果和用户体验上产生了显著收益。
2.3 自研内核与资源隔离技术:推动云原生场景下的高效混部与资源优化
快手工程师开发的C++、Java、Python、Go程序均运行在其自研内核上,该内核针对云原生场景进行了深度定制,包括内核隔离、GPU虚拟化等特性。为确保OS的稳定性,快手建设了一系列工具,如自动化测试框架,以提高问题定位和修复效率。同时,针对新硬件如不同品牌的CPU和GPU的引入,内核也进行了大量适配,以支撑新硬件的演进。此外,由于CentOS停服,快手也自研KwaiOS来作为替代。
在当前环境下,为最大化资源利用和控制成本,我们期望在同一台机器上同时部署在线和离线业务。然而,这种高密度部署虽提高了资源利用率,却加剧了业务间的干扰,特别是在线业务易受抖动影响,威胁其可用性。为解决此问题,我们在操作系统内核层面加强了隔离。基于行业方案进行重构,我们将调度树拆分为在线和离线两棵,核内调度时优先在线业务,确保在线可绝对抢占离线资源,减少了离线对在线的干扰。但在推广搜等内存瓶颈突出、延时敏感的业务中,我们面临新的挑战。为此,我们推出快手2.0阶段的CPU调度策略优化方案,引入双队列,将在线和离线的负载均衡彻底分开,在整个物理机层面先调度在线,进一步降低离线对在线的干扰。上线调度QoS后,在线业务调度延时大幅下降。
上述QoS调度是内核隔离技术体系的关键一环,我们共研发了15种隔离能力,其中7项源自社区和阿里,8项针对快手场景进行了重构和优化。我们还在研发LLC隔离和CoreFirst调度能力,实现极端敏感场景下的在线无感混部,做到几乎任意业务都具备在离混部的能力。采用这10多项内核隔离技术后,整机利用率在符合业务SLO标准下翻倍提升。然而,提升容器云整体利用率还需在集群层面努力,如统一调度、资源合池、运营治理等,这是一个庞大体系化工程,而内核隔离是基础和前置条件。目前,快手通用在线混部集群在规模和日均利用率上均达行业领先水平。
随着智算时代的到来,快手研发了GPU虚拟化技术,可将单张物理GPU卡虚拟为多张虚拟卡,支持多在线业务或在线与离线业务的混合部署,提升GPU利用率且对业务无影响。同时,鉴于内存成本上升及内存容量成为多业务场景的瓶颈,系统软件层面亦研发了JVM弹性内存和内核冷热内存技术,通过冷热分级和压缩下沉冷数据至低成本设备(如ZRAM、SSD、云盘),实现整机内存节省超20%。
2.4 系统诊断与微架构:为数十万服务器稳定性、高性能保驾护航
系统诊断与微架构是快手系统软件比较有特色的地方。系统诊断团队专注于保障公司数十万台服务器的稳定运行,解决宕机、夯机及干扰等稳定性难题,无论是单机故障还是系统级复杂问题,均承担最终兜底责任。微架构团队深挖CPU/GPU微架构潜力,优化硬件性能。例如,针对AMD CPU在某些场景下性能优于Intel但早期表现不佳的情况,团队通过NUMA/SubNUMA技术优化,使AMD性能提升20%~30%,成功推动数万台AMD服务器大规模部署。此外,采用大页技术(THP)减少TLB miss,加速内存访问,性能提升6%~10%,有效优化内存延时,解决内存墙问题。
2.5 极致性能优化:实现CPU性能翻倍与资源节省
快手系统软件常用的CPU性能优化方法论如下,其核心目标是在确保符合SLO的前提上,最大化提升单机吞吐能力(对于在线服务而言,通常体现为QPS的提升)。这一优化过程在三个维度发力:利用率提升让程序跑得更满,比如前面提到的协程和在离线混部就是这个维度;在IPC提升维度,比如前面提到的通过微架构优化能提升IPC;另外复杂度降低维度,比如业务做的简化架构、请求合并、无用逻辑删除等等都是这个维度。
今年我们协助业务优化了一个看似简单的size函数,该函数仅占两行代码,却消耗了整体8.4%的CPU。从算法复杂度看难以理解,但从微架构视角分析,其cache命中率极低,大部分时间用于从内存加载数据,即遇到内存墙问题。使用prefetch因数据地址无规律而无效。随后,我们从功能模块整体出发,增强乱序执行能力,降低数据依赖粒度,提升CPU乱序执行概率,最终使功能模块性能提升30%,size函数CPU占比降至2.5%左右。结合BOLT、LTO编译技术及THP(透明大页)等,整体性能翻倍,节省数千台服务器资源。
三、系统软件演进总结
在过去四年里,系统软件团队实现了从0到1的突破性演进,为快手带来了众多高价值的技术成果。尽管篇幅所限,许多精彩的技术细节未能详尽展现,但我们依然热忱地邀请您莅临快手,与我们深入交流探讨。系统软件技术团队汇聚了一群对技术充满热爱、敢于挑战自我的新老伙伴。他们与快手共同成长,不仅为公司创造了卓越的技术价值,也在个人成长的道路上不断前行。
如今,系统软件团队仍在持续进化,我们渴望吸纳更多有志于技术创新的人才加入,共同为公司的繁荣发展贡献智慧与力量。如果您对我们的技术充满好奇,或者渴望与我们进行深度的技术交流,请随时联系我们(xionggang@kuaishou.com)。我们期待着与您携手共进,共同开创技术新篇章!
「我们是谁」
系统软件连接软件和硬件,处于软件最底层,起到承上启下的作用,如果把软件体系比喻为一颗大树的话,系统软件是“树根”。快手系统软件涵盖JVM、编译系统、操作系统、微架构、系统诊断、系统观测、性能优化等领域,为公司业务提供稳定、高效、安全的计算底座。
「我们的使命」
打造云原生、AI友好的软硬连接器,向下做好资源管理和抽象,向上稳定、高效、安全支撑好平台和业务。