四年匠心磨砺,快手系统软件技术创新与领域演进之路

一、系统软件技术的核心价值与面临挑战

系统软件作为软件架构的基石,扮演着连接软件与硬件的桥梁角色,位于整个软件生态的最底层,处于关键核心的位置。系统软件最为显著的特征在于其规模效应,随着服务器体量的增加,系统软件研发的价值愈发凸显。

首先,系统软件技术能够显著提升服务器资源的利用率,实现翻倍效果,同时性能也能提升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友好的软硬连接器,向下做好资源管理和抽象,向上稳定、高效、安全支撑好平台和业务。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/498557.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用JMeter对Linux生产服务器进行压力测试

安装 JMeter wget https://downloads.apache.org/jmeter/binaries/apache-jmeter-5.4.1.tgz tar -xzf apache-jmeter-5.4.1.tgz cd apache-jmeter-5.4.1创建 JMeter 脚本 设置中文 选择Options—>Choose Language—>选择其他语言(例如:Chinese&am…

Nginx1.20.2-Linux-安装

文章目录 1.下载压缩包1.官网下载2.找到1.20.23.百度网盘 2.Linux安装1.搭建gcc环境2.上传到 /usr/local/nginx1.20.23.解压1.解压到当前目录2.删除压缩包 4.配置Nginx的编译路径1.进入nginx-1.20.22.执行内部的脚本,指定编译路径为/usr/local/nginx 5.编译并安装6.…

常用的linux命令介绍

Linux是一个强大的操作系统,它提供了许多命令行工具来帮助用户管理文件和目录、监控系统性能、以及执行各种系统管理任务。下面是一些常用的Linux命令,我会用简单的语言来解释它们的作用: 1. ls • 作用:列出目录内容。 • 比喻&a…

linux--编译驱动模块【虚拟网卡 tun】

linux--编译驱动模块【虚拟网卡 tun】 1 介绍2 操作2.1 源码 linux-5.10.1602.2 安装控制台应用程序依赖库,其他库2.3 普通用户模式操作2.4 然后配置需要编译的模块2.5 关闭 preempt2.6 开启 bpf【未成功,放弃】2.7 编译模块报错处理一:缺少证…

前端超大缓存IndexDB、入门及实际使用

文章目录 往期回顾项目实战初始化表获取列表新增表的数据项获取详情根据ID获取详情根据其他字段获取详情 删除数据 总结 往期回顾 在之前的文章中,我们介绍了IndexDB vs Cookies vs Session这几个的对比,但是没有做实际项目的演示,今天我们用…

swiftui开发页面加载发送请求初始化@State变量

在SwiftUI中,你不能直接在init中更新State变量,因为State是由SwiftUI框架管理的,初始化时不允许直接修改。所以需要在onAppear发送请求然后修改State状态。 在SwiftUI中,如果希望在页面加载时立即发送网络请求,可以使…

OpenStack系列第四篇:云平台基础功能与操作(Dashboard)

文章目录 1. 镜像(Image)添加镜像查看镜像删除镜像 2. 卷(Volume)创建卷查看卷删除卷 3. 网络(虚拟网络)创建网络查看网络删除网络 4. 实例类型创建实例类型查看实例类型删除实例类型 4. 密钥对&#xff08…

3D数学基础2

矩阵的行列式 在任意方阵中都存在至少一个标量,称作该方阵的行列式。在线性代数中,行列式有很多有用的性质 线性运算法则 方阵 M M M的行列式记作 ∣ M ∣ |M| ∣M∣或“det M”。非方阵矩阵的行列式是未定义的。 注意,在书写行列式时&…

elementui的默认样式修改

今天用element ui ,做了个消息提示,发现提示的位置总是在上面,如图: 可是我想让提示的位置到下面来,该怎么办? 最后还是看了官方的api 原来有个自定义样式属性 customClass 设置下就好了 js代码 css代码…

WebRTC:实现浏览器与移动应用的实时通信

1.技术简介 (Web Real-Time)是一种开放式实时通信技术,旨在使浏览器和移动应用程序通过简单的API即可实现实时音频、视频和数据传输,而无需安装插件或额外软件。它支持网络应用中的点对点通信,例如视频聊天、语音通话…

NVR小程序接入平台EasyNVR使用FFmpeg取流时提示错误是什么原因呢?

在视频监控系统中,FFmpeg常用于从各种源(如摄像头、文件、网络流等)获取流媒体数据,这个过程通常称为“取流”。 在EasyNVR平台中,使用FFmpeg取流是一种常见的操作。FFmpeg作为一款强大的开源多媒体处理工具&#xff…

NXP i.MX8系列平台开发讲解 - 5.4 调试篇 - 掌握perf 工具调试(一)

专栏文章目录传送门:返回专栏目录 Hi, 我是你们的老朋友,主要专注于嵌入式软件开发,有兴趣不要忘记点击关注【码思途远】 文章目录 目录 掌握perf 工具调试(一) 1. Perf 工具介绍 1.1 Perf 工作原理 1.2 Perf 工具基本功能 2. Perf 安…

实际部署Dify可能遇到的问题:忘记密码、开启HTTPS、知识库文档上传的大小限制和数量限制

背景 前面我们以 docker compose 容器化的方式本地部署了 Dify 社区版,并快速体验了其聊天助手、工作量编排以及智能体(Agent)功能。不过后续实际生产环境使用时遇到了忘记密码、如何开启SSL以支持HTTPS、如何突破知识库文档上传的大小限制和…

Python 青铜宝剑十六维,破医疗数智化难关(上)

一、医疗数智化困境剖析 在当今数智化浪潮的席卷下,医疗行业正经历着深刻变革,医疗数智化转型已成为不可阻挡的趋势。它将现代信息技术深度融入医疗的各个环节,从电子病历的广泛普及,实现医疗信息的便捷存储与快速查阅&#xff0…

Kafka 性能提升秘籍:涵盖配置、迁移与深度巡检的综合方案

文章目录 1.1.网络和io操作线程配置优化1.2.log数据文件刷盘策略1.3.日志保留策略配置1.4.replica复制配置1.5.配置jmx服务1.6.系统I/O参数优化1.6.1.网络性能优化1.6.2.常见痛点以及优化方案1.6.4.优化参数 1.7.版本升级1.8.数据迁移1.8.1.同集群broker之间迁移1.8.2.跨集群迁…

易基因: BS+ChIP-seq揭示DNA甲基化调控非编码RNA(VIM-AS1)抑制肿瘤侵袭性|Exp Mol Med

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 肝细胞癌(hepatocellular carcinoma,HCC)早期复发仍然是一个具有挑战性的领域,其中涉及的机制尚未完全被理解。尽管微血管侵犯&#xff08…

代码随想录算法【Day7】

DAY7 454.四数相加II 特点: 1.只用返回元组的个数,而不用返回具体的元组 2.可以不用去重 暴力思路:遍历,这样时间复杂度会达到O(n^4) 标准思路:用哈希法(场景:在一个集合里面判断一个元素…

[TOTP]android kotlin实现 totp身份验证器 类似Google身份验证器

背景:自己或者公司用一些谷歌身份验证器或者microsoft身份验证器,下载来源不明,或者有广告,使用不安全。于是自己写一个,安全放心使用。 代码已开源:shixiaotian/sxt-android-totp: android totp authenti…

Type c系列接口驱动电路·内置供电驱动电路使用USB2.0驱动电路!!!

目录 前言 Type c常见封装类型 Type c引脚功能详解 Type c常见驱动电路详解 Type c数据手册 ​​​​​​​ ​​​​​​​ 编写不易,仅供学习,请勿搬运,感谢理解 常见元器件驱动电路文章专栏连接 LM7805系列降压芯片驱动电路…

【竞技宝】LOL:IG新赛季分组被质疑

北京时间2024年12月31日,今天已经2024年的最后一天,在进入一月之后,英雄联盟将迎来全新的2025赛季。而目前新赛季第一阶段的抽签结果已经全部出炉,其中人气最高的IG战队在本次抽签中抽到了“绝世好签”引来了网友们的质疑。 首先介…