綜述
網際網路推動著商業社會的快速變革,對於美團等超大型網際網路服務提供商而言,其資料庫系統需要對仍在飛速增長的海量業務數據進行快速處理。這些核心資料庫往往屬於典型的性能密集型應用,內存的容量與性能在很大程度上影響著上層業務的處理效率以及可用性。此外,龐大的部署規模也使得內存的總體擁有成本(TCO) 變得相當敏感。
為了應對億級用戶給資料庫系統帶來的性能壓力,支撐業務創新,為用戶提供高速穩定的網際網路服務,美團將 Cellar 存儲系統伺服器中的處理器替換為第二代英特爾至強可擴展處理器,同時結合美團面向 Cellar 存儲系統進行的軟體優化,最終將資料庫性能提升 20%,幫助美團進一步優化了資料庫系統,可有效支撐未來業務的增長需求。
挑戰:如何解決 Cellar 存儲面臨的 PAUSE 指令問題
作為中國領先的生活服務電子商務平臺,美團服務涵蓋餐飲、外賣、打車、共享單車、酒店旅遊、電影、休閒娛樂等200 多個品類,業務量實現了快速發展。2019年,美團年度交易用戶總數達4.5 億,平臺活躍商戶總數達620 萬,用戶平均交易筆數達到 27.4 筆。近年來,美團一直使用分布式 KV 存儲系統Cellar 作為最重要的在線存儲服務之一,承載其海量的網際網路業務。
Cellar 是一個在 Tair 基礎上研發的NoSQL 存儲,在底層支持Leverldb 、rockdb、mdb和 rdb 等引擎,各節點直接通過raft 進行複製。Cellar 支持異地容災、無損數據遷移,元信息存在單獨節點,並且通過添加observer的形式實現路由查詢能力擴展、客戶與中間節點分離。目前,Cellar 已經承載了美團在線服務每天萬億級的請求量,並保持著高達 99.999% 的服務可用性。
圖1:美團 Cellar 存儲架構
網際網路服務的典型特徵是流量大,美團發現,在業務高峰期的時候,Cellar 存儲系統常常會遇到異常的性能降低問題。研究之後發現,其原因在於英特爾處理器中使用的 PAUSE 指令:不同架構的英特爾至強處理器有著不同的 PAUSE 指令時長。其中,第二代英特爾至強可擴展處理器(CascadeLake 架構)的指令時長為 44 cycle,而上一代的英特爾至強可擴展處理器(Skylake 架構) PAUSE 指令時長為 144 cycle。業務應用程式設計一般基於Broadwell架構,頻繁調用該指令的應用程式運行在Skylake上時,就會出現負載相對過高的現象。
這是因為,這些程序的內部自旋,就是通過固定次數的 PAUSE 循環實現,PAUSE 指令周期增加時,執行自旋的時間也會增加,對於系統整體的吞吐量會造成影響。如果程序中使用固定次數的PAUSE 循環來實現一段時間的延遲,以此阻塞程序執行,可能引發非預期的延遲,這突出體現在對於 Spinlock 的影響。
Spinlock又稱自旋鎖,是為實現保護共享資源而提出的一種鎖機制。當執行spin-wait循環的時候,處理器會因為在退出循環的時候檢測到內存訪問順序衝突而導致嚴重的性能損失,而 PAUSE 指令主要用於提示處理器目前處於spin-wait中。如上所述,這些程序的內部自旋,是通過固定次數的PAUSE 循環實現,在 PAUSE 指令時長增加之後,可能會帶來執行自旋的時間延長。
此外,普通 Spinlock 在處理器多核心的情況下,同一時間只能有一個 CPU 線程獲取變量並自旋,而緩存一致性協議為了保證數據的正確,會對所有 CPU 線程的狀態和數據進行同步、失效等操作,導致性能下降。
除了 Spinlock 之外,PAUSE 指令還會對於內存分配帶來影響。在內存分配過程中,鎖會造成線程等待,對性能影響巨大。
在 Cellar 的業務實踐中,美團發現,當負載較高時,與Broadwell 架構的英特爾立處理器相比,Skylake 的英特爾處理器負載高15% 左右。通過vTune 分析和源碼分析,原因隨之浮現:Cellar 服務在高負載時會大量調用Spinlock,PAUSE指令周期的增加導致了CPU負載的增高。
雖然通過軟體優化的方式有助於解決 PAUSE 指令所帶來的性能下降問題,但是如果在新部署的存儲伺服器中直接選擇了針對此指令進行優化的新型處理器,則不僅能夠降低問題影響,還有助於充分發揮新型號處理器在性能、創新功能等方面的優勢。在此背景下,美團與英特爾密切合作,對於最新的硬體產品與技術進行測試、驗證、部署,並充分優化存儲軟體,以最大化發揮硬體性能。
解決方案:基於第二代英特爾至強可擴展處理器的 Cellar 存儲優化
為了在提升 Cellar 存儲系統性能的同時控制 TCO 的增長,美團與英特爾展開了深度合作,將伺服器中的處理器替換為二代英特爾至強金牌處理器5218,並在性能驗證中將Cellar 存儲系統的工作負載遷移到使用該處理器構建的平臺上。
針對PAUSE指令對 Cellar 造成的影響,美團採用了兩種方法:在軟體層面,美團動態調整Cellar 對Spinlock 的調用次數,在應用中將循環次數降低,從而控制 PAUSE 指令執行的時長。
此外,美團還將替換libc 的內存分配為Jemalloc,以減少鎖的使用,優化 Cellar 存儲系統實際業務。JeMalloc 是一款內存分配器,與其它內存分配器相比,它最大的優勢在於多線程情況下的高性能以及內存碎片的減少。為避免線程競爭鎖的發生,JeMalloc 使用了線程變量,內存分配將在線程自帶的內存管理器中完成,無需和其它線程進行競爭。此外,JeMalloc 中的每個線程都通過線程號的映射對應到一個數組元素中,可降低多個線程競爭一個元素的機率。由於競爭鎖發生機率的降低,PAUSE 指令時長的增長對於內存管理的影響也能得到相應的控制。因此,通過將應用中的內存分配器更改為 JeMalloc,有助於緩解 PAUSE 指令周期增加所帶來的吞吐量降低的問題。
在硬體層面,美團將部分存儲伺服器中的處理器升級為採用了 Cascade Lake架構的二代英特爾至強可擴展處理器,二代英特爾至強可擴展處理器將PAUSE 指令時長從 144 cycle 降低為 44 cycle,從而徹底消除了PAUSE指令變化帶來的影響。
此外,二代英特爾至強可擴展處理器還帶來了額外的性能提升。該處理器專為數據中心現代化革新而設計,能夠提高各種基礎設施、企業應用及技術計算應用的運行效率,進而改善總體擁有成本(TCO),提升用戶生產力。它擁有更高的每核性能,能夠在計算、存儲和網絡應用中,為計算密集型工作負載提供高性能和可擴展性。得益於英特爾超級通道互聯(英特爾® UPI)、英特爾Infrastructure Management 技術(英特爾IMT)、英特爾高級矢量擴展指令集512(英特爾® AVX-512)等領先功能,它可滿足嚴苛的 I/O 密集型工作負載的需求,能夠幫助企業打造出性能更強的敏捷服務和突破性功能。
效果:Cellar 存儲系統性能提升20%
為了驗證在處理器更換為二代英特爾至強可擴展處理器之後,Cellar 存儲系統的性能提升,美團通過測試進行了驗證(測試配置如表2所示)
表2
數據顯示,與基於英特爾至強E 系列處理器的 Cellar 存儲系統相比,基於二代英特爾至強可擴展處理器的 Cellar 存儲系統提升了 20% 左右。
從成本效益來看,二代英特爾至強可擴展處理器的應用通過顯著的性能提升,節約了在存儲節點方面的投入,總體擁有成本能夠得到更好的控制,也更具面向未來工作負載的擴展性。
合作夥伴表示:「無論是卓越的硬體特性,還是在 PAUSE 指令等方面的優化,二代英特爾至強可擴展處理器都對 Cellar 存儲系統性能的提升起到了至關重要的作用。通過雙方的密切合作,我們不僅驗證了二代英特爾至強可擴展處理器在存儲系統性能優化過程中的關鍵作用,也為之後的進一步優化奠定了堅實基礎。」
圖3:性能優化對比
展望:美團與英特爾加速網際網路基礎設施創新
在發展過程中,美團正致力於去探索Cellar 等具備突破性的存儲解決方案,並實踐新的運維方式,以滿足業務的快速增長需求。美團計還將繼續攜手英特爾,充分利用軟硬體技術的最新發展成果,打造高性能資料庫解決方案,為內外部用戶提供更高效、更可靠的服務。
除了資料庫之外,美團與英特爾還在廣泛的領域進行了合作,利用二代英特爾至強可擴展處理器等產品所帶來的革命性技術能力,構建高性能的基礎設施,在不斷增長的核心網際網路業務場景以及關鍵應用和服務中發揮越來越重要的作用,這也有助於美團為用戶提供更高效、更多元化的應用體驗。