自 UCloud 在 5 月 28 日的 TIC 大會上發佈 「快傑」 雲主機後,已通過去了近半年的時間,在這半年間,「快傑」 憑藉優越的性能與極高的性價比,在雲主機市場中走出了本身的獨特道路。在這些成果背後,咱們用兩個詞來闡述 「快傑」 的技術理念:All in one & One for all。前端
All in one & One for all算法
做爲雲計算的基石產品,雲主機的核心特性決定了雲上其它能力的拓展,也直接關乎於用戶的使用體驗。用戶選擇雲計算的出發點在於:簡單性,速度和經濟性。可是因爲互聯網與 IT 服務的場景多樣化,業內大多數廠商都是分別推出適應不一樣場景的雲主機類型,但也所以帶給了用戶運維和採購的複雜度。數據庫
什麼是 「All in one」 呢?「快傑」 將本身定義爲 「簡單」 的產品。簡單不只意味着使用方便,還意味着多項軟硬件技術的融合,以此爲用戶提供超高的產品性能。也就是說,當你面對各種業務場景下 CPU、網絡、存儲的不一樣性能需求時,無需考慮太多因素,「快傑」 都可知足。後端
這是 「快傑」 的一組數據:安全
全面搭載 Intel 最新一代 Cascade Lake 處理器性能優化
配備 25G 基礎網絡並採用全新的網絡加強 2.0 方案服務器
支持 RDMA-SSD 雲盤網絡
網絡性能最高可達 1000 萬 PPS併發
存儲性能最高可達 120 萬 IOPS框架
在產品上線之初,咱們對 「快傑」 進行了跑分測試,測試結果顯示,同等規格的配置下,「快傑」 的性能明顯優於市場上同類型的雲主機產品。舉個例子,在一樣 8 核 16G 的配置下,「快傑」 的網絡性能較友商高出 3 倍多,存儲性能有着近 4 倍的差別。
可是在這樣的高配下,「快傑」 的價格提高卻不超過 20%,部分配置機型的價格與普通機型價格基本持平或略有降低,雲盤價格僅爲市場同類產品的 60% 或者更低。「快傑」 用 「One for all」 的價格紅利將全部技術又統統回饋給了用戶。
「羅馬不是一天建成的」,不管是 All in one 仍是 One for all,在這些數據的背後,都離不開 UCloud 在技術上的持續探索和積累。接下來,咱們就來聊聊 「快傑」 背後的技術進階之路。
01
網絡加強 2.0:4 倍性能提高 + 3 倍時延降低
網絡通道是嚴重製約雲主機性能的瓶頸之一,在這裏,值得一提的即是 「快傑」 在 25G 智能網卡網絡加強能力方面作出的技術突破。
| 硬件級別的網卡加速
基於雲主機網絡性能提高的需求,25G 網絡逐漸成爲趨勢。可是因爲傳統軟件 Virtual Switch 方案的性能瓶頸:當物理網卡接收報文後,是按照轉發邏輯發送給 VHost 線程,VHost 再傳遞給虛擬機,所以 VHost 的處理能力就成爲了影響虛擬機網絡性能的關鍵。
在調研了業界主流的智能網卡方案以後,咱們最終採用了基於 Tc Flower Offload 的 OpenvSwitch 開源方案,爲 「快傑」 提供了硬件級別的網卡加速。虛擬機網卡可直接卸載到硬件,繞過宿主機內核,實現虛擬機到網卡的直接數據訪問。相較於傳統方案,新的智能網卡方案在整個 Switch 的轉發性能爲小包 24Mpps,單 VF 的接收性能達 15Mpps,使得網卡總體性能提高 10 倍以上,應用在雲主機上,使得 「快傑」 的網絡能力提高至少 4 倍,時延下降 3 倍。
| 技術難點突破:虛擬機的熱遷移
在該方案落地之時,咱們遇到了一個技術難題:虛擬機的熱遷移。由於各個廠商的 SmartNIC 都是基於 VF passthrough 的方案,而 VF 的不可遷移性爲虛擬機遷移帶來了困難,在此將咱們的解決方案分享給你們。
經過調研咱們發現,用戶不須要手工設置 bonding 操做或者製做特定的鏡像,能夠妥善解決用戶介入的問題。受此啓發,咱們採用了 VF+Standby Virtio-net 的方式進行虛擬機的遷移 。具體遷移過程爲:
一、建立虛擬機自帶 Virtio-net 網卡,隨後在 Host 上選擇一個 VF 做爲一個 Hostdev 的網卡,設置和 Virtio-net 網卡同樣的 MAC 地址,attach 到虛擬機裏面,這樣虛擬機就會對 Virtio-net 和 VF 網卡自動造成相似 bonding 的功能,此時,在 Host 上對於虛擬機就有兩個網絡 Data Plane;
二、Virtio-net backend 的 tap device 在虛擬機啓動時自動加入到 Host 的 OpenvSwitch bridge 上,當虛擬機網卡進行切換的時候 datapath 也須要進行切換。VF attach 到虛擬機後,在 OpenvSwitch bridge 上將 VF_repr 置換掉 tap device。
02
RDMA-SSD 雲盤:提供 120 萬 IOPS 存儲能力
在雲盤優化方面,咱們主要從 IO 接入層性能優化、RDMA 網絡加速及後端存儲節點提高三方面來完成 RDMA-SSD 雲盤的技術實現,最終爲 「快傑」 提供 120 萬 IOPS 的存儲能力。
| 基於 SPDK 的 IO 接入層性能優化
以下圖,爲傳統的 OEMU Virtio 方案示意,在第 3 步時, QEMU 裏的驅動層經過 Gate 監聽 Unix domain socket 的轉發 IO 請求時,存在額外的拷貝開銷,所以成爲 IO 接入層的性能瓶頸。
圖:QEMU Virtio 方案示意
針對該問題,UCloud 使用了 SPDK VHost 來優化虛擬化 IO 路徑。
(1)SPDK VHost:實現轉發 IO 請求的零拷貝開銷
SPDK(Storage Performance Development Kit ) 提供了一組用於編寫高性能、可伸縮、用戶態存儲應用程序的工具和庫,基本組成分爲用戶態、輪詢、異步、無鎖 NVMe 驅動,提供了從用戶空間應用程序直接訪問 SSD 的零拷貝、高度並行的訪問。
圖:SPDK VHost 方案
如上圖,在應用 SPDK VHost 方案後,IO 路徑流程以下:
① 提交 IO 到 virtqueue;② 輪詢 virtqueue,處理新到來的 IO;③+④ 後端存儲集羣處理來自 Gate 的 IO 請求;⑤ 經過 irqfd 通知 Guest IO 完成。
最終 SPDK VHost 經過共享大頁內存的方式使得 IO 請求能夠在二者之間快速傳遞,這個過程當中不須要作內存拷貝,徹底是指針的傳遞,所以極大提高了 IO 路徑的性能。
以下表,咱們對新老 Gate 的性能作了測試對比。能夠看到,在應用 SPDK VHost 之後,時延和 IOPS 獲得了顯著優化,時延下降 61us,IOPS 提高 58%。
(2)開源技術難點攻破:SPDK 熱升級
在咱們使用 SPDK 時,發現 SPDK 缺乏一項重要功能 —— 熱升級。咱們沒法 100% 保證 SPDK 進程不會 crash 掉,一旦後端 SPDK 重啓或者 crash,前端 QEMU 裏 IO 就會卡住,即便 SPDK 重啓後也沒法恢復。
圖:virtio vring 機制示意
經過深刻研究 virtio vring 的機制,咱們發如今 SPDK 正常退出時,會保證全部的 IO 都已經處理完成並返回了才退出,也就是所在的 virtio vring 中是乾淨的。而在乎外 crash 時是不能作這個保證的,意外 crash 時 virtio vring 中還有部分 IO 是沒有被處理的,因此在 SPDK 恢復後須要掃描 virtio vring 將未處理的請求下發下去。
針對該問題,咱們在 QEMU 中針對每一個 virtio vring 申請一塊共享內存,在初始化時發送給 SPDK,SPDK 在處理 IO 時會在該內存中記錄每一個 virtio vring 請求的狀態,並在乎外 crash 恢復後能利用該信息找出須要從新下發的請求,實現 SPDK 的熱遷移。
| RDMA 網絡加速
(1)TCP 瓶頸
在解決了 IO 路徑優化問題後,咱們繼續尋找提升雲盤 IO 讀寫性能的關鍵點。在協議層面,咱們發現使用 TCP 協議存在如下問題:
TCP 收發數據存在網卡中斷開銷,以及內核態到用戶態的拷貝開銷;
TCP 是基於流式傳輸的,所以一般網絡框架(libevent)會使用一個緩衝區暫存數據,等到數據達到可處理的長度才從緩衝區移除,一樣地,發包過程爲了簡化 TCP 緩衝區滿引發的異常,網絡框架也會有一個發送緩衝區,那麼這裏就會產生二次拷貝。
圖:TCP 協議原理示意
針對這個問題,咱們用 RDMA 協議來代替 TCP 協議,來達到提高 IOPS 和時延的能力。
(2)RDMA 代替 TCP
RDMA (Remote Direct Memory Access) 技術全稱遠程直接數據存取,是爲了解決網絡傳輸中服務器端數據處理的延遲而產生的。
使用 RDMA 代替 TCP 的優勢以下:
① RDMA 數據面是 bypass kernel 的,數據在傳輸過程當中由網卡作 DMA,不存在數據拷貝問題。② RDMA 收發包過程是沒有上下文切換的,發送時將數據 post_send 投遞到 SQ 上,而後通知網卡進行發送,發送完成在 CQ 產生一個 CQE;接受過程有一些差別,RDMA 須要提早 post_recv 一些 buffer,網卡收包時直接寫入 buffer,並在 CQ 中產生一個 CQE。③ RDMA 爲消息式傳輸,即假設發送方發送一個長度爲 4K 的包,接收方假如收到了,那麼這個包的長度就是 4K,不存在只收到一部分的狀況。RDMA 提供的這種能力能夠簡化收包流程,不須要像 TCP 同樣去判斷數據是否收全了,也就不存在 TCP 所需的緩衝區。④ RDMA 的協議棧由網卡實現,數據面 Offload 到網卡上,解放了 CPU,同時帶來了更好的時延和吞吐。
圖:RDMA 協議原理示意
| 後端存儲節點 IO Path 加速
除了在 IO 路徑接入與傳輸協議方面作了改進以外,UCloud 還針對雲硬盤後端存儲節點進行了優化。
對於原有的 Libaio with Kernel Driver,咱們採用了 SPDK NVMe Driver 進行了替代,下圖爲 Fio 對比測試二者的單核性能狀況,能夠看到應用 SPDK NVMe Driver 後性能有了較大的提高。
圖:Libaio with Kernel Drive & SPDK NVMe Driver 單核性能比較
此外,SPDK NVMe Driver 使用輪詢模式,能夠配合 RDMA 發揮出後端存儲的最佳性能。
綜上,咱們實現了雲盤的全面優化:使用 SPDK VHost 代替 QEMU,實現虛機到存儲客戶端的數據零拷貝;使用高性能 RDMA 做爲後端存儲的通訊協議,實現收發包卸載到硬件,使得 RSSD 雲盤的延遲下降到 0.1 毫秒,體驗幾乎和本地盤一致;存儲引擎由 SPDK 代替 libaio,高併發下依然能夠保持較低的時延。再配合 全 25G 的底層物理網絡,使 RDMA-SSD 雲盤的隨機讀寫性能達到最佳,實現 120 萬 IOPS。
圖:RDMA-SSD 雲硬盤原理圖
03
內核調優:產品綜合性能提高 10%
提起雲主機,更多的會想到計算、存儲、網絡,甚少有人關注內核。然而,內核構建是一個雲主機的核心工做,它負責管理系統的進程、內存、設備驅動程序、文件和網絡系統等,對雲主機性能和穩定性相當重要。
未優化以前,咱們對雲主機中特定業務場景進行了基準性能測試。在測試過程當中,利用 perf、systemtap、eBPF 等多種動態跟蹤技術,在 Host 內核、KVM 和 Guest 內核等不一樣觀測層級上,對影響性能的因素進行了指令級別的分析。
在此基礎上,咱們針對性的進行了內核加強和優化工做。
| CPU 加強 & 漏洞修復
咱們在 QEMU 和 KVM 中添加了 Intel 新一代 Cascade Lake 虛擬 CPU 的支持,相比上一代 Skylake,增長了 clflushopt、pku、axv512vnni 等指令集,在特定場景下性能表現更加出色。此外,針對 CPU 漏洞方面,咱們利用硬件解決了 Meltdown,MDS,L1TF 等漏洞,同時針對 Spectre_v2 補丁添加了代價更小的 Enhanced IBRS 加強修復機制,在虛擬化層面對漏洞進行了修復。最後,咱們將硬件修復能力賦予」 快傑」,使得雲主機能夠避免 Guest 內核在軟件層面修復安全漏洞,消除這方面引發的性能開銷和業務指標降低。
| CPU 對內存讀寫能力優化
針對 CPU 對內存讀寫能力的優化,咱們主要從兩方面來實現。
首先咱們基於硬件內存虛擬化(Intel EPT),添加了定製化大頁內存的支持,從而避免了以前內存虛擬化中存在的管理器 / 分配器開銷、換頁延遲等,極大減小了頁表大小和 TLB miss,同時保證雲主機內存與其餘雲主機、系統軟件間相互隔離,避免影響。
其次,咱們加強了 NUMA 親和性的使用。衆所周知,跨節點訪問內存的延遲遠遠大於本地訪問所產生的,針對該問題,咱們經過合理的資源隔離和分配,使雲主機的 VCPU 和內存綁定在同一個節點。此外,對於大型雲主機可能存在單個節點資源不夠的狀況,咱們將雲主機分配在兩個節點,把節點的拓撲結構暴露給 Guest 內核,這樣雲主機能夠更方便的利用 NUMA 特性對關鍵業務進行調度管理。
圖:NUMA 親和性的使用
| Host 內核 & KVM 優化
結合性能分析數據,咱們對 Host 內核和 KVM 也進行了大量的優化。
在 VCPU 調度方面,咱們發現 CFS 調度器會在臨界區內使用時間複雜度爲 O (n) 的算法,致使調度器開銷太高、Guest 計算時間減小及調度延遲增大,咱們在 CFS 中修復了這一問題。
此外,在 Host/Guest 上下文切換過程當中,咱們發現某些寄存器的上下文維護代碼會引入必定開銷,所以在保證寄存器上下文切換正確性的同時,咱們也去掉了這些維護代碼引發的開銷。
在雲主機運行過程當中,會產生大量的核間中斷(IPI),每次 IPI 都會引發 VMExit 事件。咱們在虛擬化層引入了兩個新的特性:KVM-PV-IPI 和 KVM-PV-TLB-Flush。經過 KVM 提供的 Send-IPI Hypercall,雲主機內核能夠應用 PV-IPI 操做消除大量 VMExit,從而實現減小 IPI 開銷的目的。在雲主機更新 TLB 的時候,做爲發起者 VCPU 會等待其它 VCPU 完成 TLB Shootdown,雲主機內核經過 PV-TLB-Flush 極大減小等待和喚醒其它 VCPU 的開銷。
以上是一些比較重要的優化工做,其它內核、KVM、QEMU 功能加強和穩定性提高等內容再也不贅述。整體評估下來,經過內核調優,可幫助」 快傑」 實現 10% 以上的綜合能力提高。
04
三大應用場景分析
基於強大的性能,「快傑」 可以輕鬆知足高併發網絡集羣、高性能數據庫、海量數據應用的使用場景。咱們分別選取了 Nginx 集羣、TiDB、ClickHouse 數據庫三個應用場景,下面來看一下」 快傑」 的表現:
| 場景 1:搭建 Nginx 集羣,突破網絡限制
愛普新媒是一家從事廣告 DSP(Demand-Side Platform,需求方平臺)業務的公司,因爲業務需求,愛普新媒對於網絡集羣的高併發要求很是高。最終,愛普新媒選擇使用 「快傑」 搭建 Nginx 集羣,做爲 API 網關對其終端客戶提供服務。
Nginx 是一款輕量級 HTTP 反向代理 Web 服務器,根據 Nginx 官網的數據,Nginx 支持了世界上大約 25% 最繁忙的網站,包括 Dropbox,Netflix,Wordpress.com 等。其特色是併發能力強,而 「快傑」 進一步提高了其併發能力。
「快傑」 突破了雲主機以前的網絡限制,以下圖,「快傑」 的應用使得愛普新媒原有集羣內主機能夠大幅度減小,而且在相同服務能力下,成本減半。
圖:「快傑」 在高併發網絡集羣場景中的表現
| 場景 2:搭建 TiDB,突破 IO 性能瓶頸
PingCAP 的 TiDB 是一款流行的開源分佈式關係型數據庫,爲大數據時代的高併發實時寫入、實時查詢、實時統計分析等需求而設計,對 IO 性能的要求無疑很是高。一般,TiDB 要求底層使用 NVMe SSD 本地磁盤支撐其性能,但快傑雲主機經過 RSSD 雲盤便可知足 TiDB 的高要求,其性能也獲得 PingCAP 工程師的實測承認。
目前,已有很多 UCloud 客戶使用快傑雲主機搭建 TiDB,突破了以前的數據庫性能瓶頸。
圖:「快傑」 在高性能數據庫場景中的表現
除了 TiDB,「快傑」 實測能有效提高各種數據庫的性能表現 20% 以上。
| 場景 3:搭建 ClickHouse,提高 2 倍數據吞吐量
TT 語音是一款專門爲手遊玩家服務的語音開黑工具,因爲業務要求需將 APP 埋點數據收集到大數據集羣中分析。TT 語音採用 「快傑」 搭建 ClickHouse 數據庫做爲整個大數據集羣的核心,對比以前,每日增量達到 8 億條記錄。
除了 ClickHouse 場景,「快傑」 還能夠對大數據生態進行全方位的優化,以下圖,數據吞吐提高高達 2 倍,助力企業大數據業務發展。
圖:「快傑」 在大數據應用場景中的表現
結語
基於 「軟硬件協同設計」 的理念,「快傑」 在網絡加強 2.0、RSSD 雲盤優化、內核調優等方面作到了技術的大幅進階,爲用戶帶來了突破性的雲主機性能提高。在 「快傑」 的技術進階路上,技術的更迭與升級能夠用語言描述出來,可是技術實現的背後卻表明了 UCloud 爲用戶創造核心價值的堅持與追求。