四年匠心磨礪,快手系統軟件技術創新與領域演進之路 原創
一、系統軟件技術的核心價值與面臨挑戰
系統軟件作為軟件架構的基石,扮演著連接軟件與硬件的橋梁角色,位于整個軟件生態的最底層,處于關鍵核心的位置。系統軟件最為顯著的特征在于其規模效應,隨著服務器體量的增加,系統軟件研發的價值愈發凸顯。
首先,系統軟件技術能夠顯著提升服務器資源的利用率,實現翻倍效果,同時性能也能提升 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 友好的軟硬連接器,向下做好資源管理和抽象,向上穩定、高效、安全支撐好平臺和業務。
