近日,由阿里雲訊息佇列團隊發表的關於 RocketMQ 鎖效能最佳化論文被 CCF-A 類軟體工程頂級會議 FM 2024 錄用。
FM 2024 是由歐洲形式化方法協會(FME)組織的第 24 屆國際研討會,會議匯聚了來自各國的形式化研究學者,是形式化方法領域的頂級會議。FM 2021 強調形式化方法在廣泛領域的開發和應用,包括軟體、網路物理系統和基於計算機的綜合系統。形式化方法以嚴格的數學化和機械化方法為基礎來規約、構建和驗證計算系統,是改善和確保計算系統質量的重要方法,其模型、技術和工具已延生成為計算思維的重要載體。
此次被錄用的論文為《Beyond the Bottleneck: Enhancing High-Concurrency Systems with Lock Tuning》。此論文靈感來源於 RocketMQ 適配阿里雲倚天 CPU 的效能最佳化過程中。RocketMQ 此前在傳送訊息的過程中存在兩種鎖:自旋鎖和互斥鎖。我們發現,不同 CPU 適合的鎖行為並不相同。糟糕的鎖行為可能導致效能的大幅下滑,而適配的鎖行為能夠在提升效能的同時降低資源損耗。這兩種鎖在版本迭代過程中,都線上上版本中使用過,且對於不同的版本來說,使用這兩種鎖可能帶來截然不同的效能結果。
因此,本文旨在提出一種新的自適應 K 值退避鎖,能夠讓高併發系統的部署者無需考慮兩種鎖的優劣勢,只需使用一把鎖即可實現效能的最優以及最低的資源損耗。 換言之,我們希望有一把鎖能夠同時具備自旋鎖、互斥鎖的特點,同時適用於競爭激烈和不激烈的情況。我們最終決定改造自旋鎖,透過一把特殊的自旋鎖,使系統在各種競爭情況下都保持非常優質的鎖行為。自旋鎖由於無限自旋直到獲取到鎖,在臨界區較大時會產生較多的空轉,耗費大量的 CPU 資源。為了能有效利用自旋鎖的優勢,因此我們要在臨界區較大時對其空轉次數的控制,從而避免大量空轉,最大程度相容臨界區較大的場景。
最終,我們基於排隊論,透過對自旋鎖的行為建模,得到了自旋次數與系統負載的關係:
我們最終基於系統的最大壓力場景提出了自適應 K 值退避鎖:進行 K 次自旋後還未獲得鎖後,執行 Thread.yield() 將 CPU 執行權交給作業系統。 這種行為能夠避免互斥鎖的無謂上下文切換,也能避免高壓場景下的無限自旋帶來的 CPU 損耗。這種行為能夠緩解系統壓力,取得自旋和 CPU 上下文切換兩種方法中的最低開銷。
在自適應 K 值退避鎖的作用下,我們能找到系統效能的區域性最優點,達到最大的 TPS 效能。結果如下表所示:
訊息傳送最大 TPS 的效能最佳化結果
此外,我們還檢查了各個 K 值下的 Broker 資源損耗情況,發現在最大 TPS 時的 K 值,同時也是資源佔用相對最低時的k值:
各個 K 值下的 CPU 使用率
以 X86 架構,同步刷盤的行為為例。實驗結果表明,在 k= 10^3 時,傳送速度不僅達到峰值(155019.20),CPU 使用率也達到最低。這表明退避策略成功地節省了 CPU 資源。此時,CPU 支援更高的效能水平和較低的利用率水平,這表明效能瓶頸已經轉移——例如,可能已經轉移到了磁碟上。在表中可以觀察到,在具有相同的 k(10^3)和配置引數(最新程式碼,SYNC 刷盤模式)的 ARM CPU 上,RocketMQ 的效能提高了 10.4%。此外,如上圖所示,當 k= 10^3 時,CPU 使用量大幅下降,從平均超過 1000% 下降到 750% 左右。資源消耗的減少表明,減輕其他系統瓶頸可能可以帶來更顯著的效能提高。
附論文資訊
錄用論文題目: 《Beyond the Bottleneck: Enhancing High-Concurrency Systems with Lock Tuning》
作者: 季俊濤,古崟佑,傅玉寶,林清山
論文概述: 高併發系統常常面臨效能瓶頸,主要是由於執行緒間激烈競爭鎖導致的等待和上下文切換。作為一家雲端計算公司,我們非常重視效能的最大化。為此,我們對輕量級自旋鎖進行了改進,並提出了一種簡潔的引數微調策略,能夠在最低風險條件下突破系統效能瓶頸。該策略在高吞吐量訊息佇列系統 Apache RocketMQ 中得到了驗證,實現了 X86 CPU 效能提升 37.58% 和 ARM CPU 效能提升 32.82%。此外,我們還確認了這種方法在不同程式碼版本和 IO 重新整理策略下的一致有效性,顯示出其在實際應用中的廣泛適用性。這項工作不僅為解決高併發系統的效能問題提供了實用工具,還突顯了形式化技術在工程問題解決中的實際價值。
相關連結:
[1] FM 2024
https://www.fm24.polimi.it/
點選此處,RocketMQ 一站式學習,最全最新的 RocketMQ 資訊、文章和答疑,盡在中文社群(https://rocketmq.io/ )!