作者 | 汪翰林
本文作者網易數帆雲網絡數據面負責人汪翰林,在工作中從事服務網格的網絡數據面性能優化,發現其中的網絡性能優化的原理具有相通性。本文對通用的網絡性能優化方法做出了總結,包括服務網格及網絡性能優化分析、網絡性能優化技術介紹、網絡性能優化思路三個方面,並列舉了實際案例進行進一步詮釋,供大家在實際做性能優化時參考。
前段時間,團隊一直在做服務網格的網絡數據面性能優化,發現其中的網絡性能優化的原理是相通的,所以就想著總結一些通用的網絡性能優化方法,供大家在實際做性能優化時參考。
服務網格及網絡性能優化分析
業務微服務化之後,為了提升微服務的治理能力,通常會引入一個業務無侵入的 sidecar 代理來提供微服務的流控、熔斷、升級等服務治理能力。sidecar 會轉發所有微服務的出口和入口流量,但這樣會導致網絡路徑增加兩跳,整個路徑拉長,相應地時延也會增加。
引入的時延主要分為 sidecar 業務處理時延以及網絡收發時延。廣義上的網絡性能優化應該是端到端的時延優化,既包括處理時延優化,也包括網絡收發時延優化。我們這裡主要討論狹義的網絡性能優化,僅包括網絡收發的時延優化。
如果打開網絡傳輸的鏈路,sidecar 額外引入了 Service 到 sidecar 以及 sidecar 到 sidecar 的鏈路,網絡時延的增加主要是因為鏈路中多經過的四次內核態 TCP/IP 協議棧的開銷。
我們通過 perf 火焰圖分析了 sidecar 應用 Envoy 的 CPU 占用,發現內核態協議棧的 CPU 占比近 50%,而剩下的 50% CPU 主要消耗在 Envoy 本身處理邏輯上。可見,網絡時延的優化的重點也就是對內核態協議棧的優化。
網絡性能優化技術
我們先來看一下針對內核態協議棧的網絡性能優化技術,注意這裡特指針對內核態協議棧的優化,因為網絡性能優化的思路還有很多,我們會在後面章節提到。
針對內核態協議棧的優化主要思路是 kernel bypass,即讓報文不經過內核態協議棧或者不經過完整的內核態協議棧,通過縮短網絡路徑來達到性能優化的目的。目前主要用到的技術包括 eBPF、用戶態協議棧以及 RDMA。
eBPF
eBPF(extended Berkeley Packet Filter)是一個內核技術,可以在不需要重新編譯內核的情況下,通過一種安全的、可編程的方式擴展內核的功能。eBPF 的主要功能是在內核層面進行安全、高效的網絡數據包過濾和處理,以及在運行時對系統進行監控和調試。eBPF 可以通過獨立的用戶空間程序來編寫和加載,這些程序可以安全地與內核交互,而不會影響內核的穩定性和安全性。
簡單來說,目前的內核協議棧處理流程的代碼中預留了很多 hook 點,用戶態編寫的程序編譯成 eBPF 位元組碼之後可以註冊到這些 hook 點,之後內核處理報文到 hook 點時就會調用這些預編譯好的位元組碼程序完成特定的功能。這樣我們就可以控制內核針對報文的處理流程,結合 eBPF 的 redirect 能力可以將報文直接轉發到對應的網絡設備或者 socket,從而做到 kernel bypass。
這裡不得不提兩類 hook 點:XDP 和 socket。XDP hook 是網卡收到報文後最早的 hook 點,可以實現在網絡驅動程序中攔截和處理報文。而 socket hook 可以攔截連接建立、收發的報文,是應用層處理報文最早的 hook 點。
不過,eBPF 程序終究還是運行在內核態,應用層進行網絡報文傳輸時還是避免不了內核態和用戶態的上下文切換開銷。對於可以完全運行在內核態的應用,如安全檢測、負載均衡等場景則可以避免這個開銷。
用戶態協議棧
顧名思義,用戶態協議棧是將協議棧的實現卸載到用戶態來實現。卸載到用戶態實現會帶來幾個好處:一是避免用戶態和內核態的上下文切換;二是根據需要定製和精簡協議棧的實現;三是調測和運維也會更加方便。
報文卸載到用戶態通常採用 DPDK 或者 AF_XDP 的方法。DPDK 是 Intel 主導的開源項目,目前主流網卡都支持,成熟且性能高,不過對於虛擬口(如 veth 口)的支持不夠好,在容器化場景受限。AF_XDP 是基於 eBPF 的報文卸載技術,可以實現在網卡驅動層針對報文攔截並卸載到用戶態,對於物理網口或者虛擬口的兼容性好,性能相比於 DPDK 稍差。
用戶態協議棧通常需要開發適配層來兼容 socket 接口,攔截 socket 調用並分發到用戶態協議棧處理,這樣應用層可以做到無需修改代碼,完全無感知。
RDMA
RDMA (Remote Direct Memory Access) 是一種高性能、低延遲的網絡通信技術,它能夠讓計算機之間直接訪問彼此內存中的數據,從而避免了傳統網絡通信中的數據拷貝和 CPU 參與的過程。所以,RDMA 是一項軟硬結合的網絡性能優化技術,將網絡傳輸卸載到 RDMA 硬體網卡中實現,提升性能的同時可以將 CPU 節省出來給應用使用。
RDMA 的實現技術分為 InfiniBand、RoCE 和 iWARP。InfiniBand 是最早的實現方式,需要專門的硬體網卡和 InfiniBand 交換機配合組網,和乙太網不兼容,成本高但性能最好。RoCE 基於乙太網傳輸 RDMA 報文,使用 UDP 封裝報文,通常需要組建基於 PFC/ECN 的無損網絡,否則丟包會導致性能劣化嚴重,總體性能較好,RoCE 的主要代表是英偉達的 Mellanox 網卡。iWARP 基於 TCP,網絡適應性好,但性能最差,代表是 Intel 網卡。
RDMA 對外提供 ibverbs 編程接口,和 socket 接口還是有較大區別,不過直接基於此進行應用代碼改造理論上性能收益最大。Mellanox 網卡在此基礎上封裝了 UCX 接口,還是不能做到完全兼容 socket 接口。由 Intel 和阿里主導的 SMC-R 可以實現 socket 接口的完全兼容,由於封裝後只能支持報文接收的中斷模式而不支持 polling 模式,會導致性能有損失,底層只能適配 RoCE,無法兼容 iWARP。
網絡性能優化思路
性能優化是一個端到端的系統性工程,遵循二八原則,即 80% 的性能損耗在 20% 的處理流程上。所以優化前還是需要分析下導致 80% 性能損耗的 20% 的處理流程到底在哪兒,是應用本身的處理邏輯還是網絡傳輸層面。通常我們可以先使用性能分析工具(如 perf)做一下分析,確定瓶頸點。即使確定是網絡傳輸的瓶頸,我們也可以先從硬體配置和組網層面進行分析:
另外,我們也可以檢查下內核參數配置,如網卡多隊列配置,收發隊列大小配置,連接跟蹤配置等。
如果以上檢查後發現還是滿足不了要求,網絡傳輸依舊是瓶頸,就可以考慮使用針對內核態協議棧的性能優化技術。那麼 eBPF/ 用戶態協議棧 /RDMA 技術我們如何來選擇呢?
從性能上來說,RDMA > 用戶態協議棧 > eBPF。
RDMA 綜合成本和性能,RoCE 用的最多,不過 RoCE 目前受限於無損網絡,組網會有限制,通常限制在一個機房甚至一個 ToR 下。
用戶態協議棧因為協議棧的定製實現,沒有內核態協議棧的功能全面,所以應用的兼容性需要 case by case 的去做驗證測試,比較適合於針對服務端的已知應用(如 Redis/Nginx/Envoy 等)的性能加速,而不太適合於作為一個通用的協議棧提供給所有應用使用。
eBPF 類似於給內核打補丁,哪裡性能不好就可以打上一個補丁,適合於小的性能優化點的修修補補。
實際案例
服務網格
服務網格實際優化時結合了 eBPF Sockops 和用戶態協議棧技術。
eBPF Sockops 註冊了連接建立的 hook 點,將五元組信息保存到 sockmap 表中,後續報文發送可以直接查詢 sockmap 表後 redirect 到對端 socket,這樣就 bypass 了內核協議棧。eBPF Sockops 適用於 Service 和 sidecar 之間鏈路的加速,因為 Service 端應用的多樣性不太適合使用用戶態協議棧加速,而伺服器內部進程間通信也不太適合 RDMA 加速。
用戶態協議棧用來加速 sidecar 和 sidecar 之間的通信鏈路,可以 bypass 掉 sidecar 之間通信的內核協議棧。因為 sidecar 之間通信的鏈路不一定能組建無損網絡,RDMA 加速不太合適。
當前用戶態協議棧我們支持性能優先模式和兼容優先模式。性能優先模式中,底層通過 DPDK 進行報文卸載,適用於物理口或者虛擬 VF 口的場景,容器化場景也可以對接 SRIOV 的容器網絡。兼容優先模式中,底層通過 AF_XDP 進行報文卸載,適用於虛擬 veth 口的場景,可以支持目前主流的容器網絡場景。
另外,用戶態協議棧在實際使用過程中可能會面臨雙棧的需求,即需要同時支持用戶態協議棧和內核態協議棧。服務網格加速場景中 sidecar 和 Service 之間通信雖然通過 eBPF 進行了加速,但本質上還是走內核。所以用戶態協議棧也需要支持根據路由配置來確定報文走內核態還是用戶態協議棧。
圖中是兼容優先模式最終加速的效果。時延有 35-40% 的降低,其中用戶態協議棧貢獻 30% 左右,eBPF 貢獻 8% 左右。
存儲
Curve 存儲是網易自研開源的分布式存儲服務。在 Curve 塊存儲的開發及優化過程中,我們發現作為分布式系統,客戶端需要通過網絡和存儲節點通信,存儲節點之間也需要網絡通信來完成多副本之間的一致性協商過程。在傳統的 TCP/IP 網絡協議棧中,網絡數據包需要在用戶態 / 內核態之間進行拷貝、TCP/IP 協議的層層解析和處理,消耗了大量的 CPU 和內存帶寬。所以我們引入 RDMA 的 RoCE v2 技術來優化這部分的網絡性能,存儲組網相對可控,交換機進行 PFC/ECN 的無損網絡配置,結合網卡的 DCQCN 擁塞控制算法可以實現基於無損網絡的 RDMA 組網。
在實際的適配過程中,使用 UCX 接口來加速客戶端和存儲節點以及存儲節點之間的的 RPC 通信,這樣可以降低整體的開發難度及對業務代碼的侵入修改。為了保證可靠且高效的 RDMA 報文傳輸,一方面,我們與交換機廠商進行密切溝通,分析並摸索建立了一套適合於系統的 ECN+PFC 配置方式;另一方面我們與網卡廠商共同分析網卡 DCQCN 擁塞控制參數對 RDMA 流量傳輸的影響,最終得出最適宜的網卡參數配置。
加速的效果:
總 結
隨著雲計算,大數據和 AI 等技術的不斷發展,大量的計算資源之間的交互越來越頻繁,對網絡的要求也越來越高,臃腫的內核協議棧處理逐漸成為網絡傳輸的瓶頸所在。本文介紹幾種內核協議棧的優化技術、相關的應用場景以及實際的優化案例,供大家參考。
作者簡介:
汪翰林,網易數帆高級技術專家,雲網絡數據面負責人。近 20 年軟體架構、設計和研發經驗,曾就職於華三和華為,主持多個安全、視頻監控、大數據和雲計算等技術領域的產品設計和研發工作。目前在網易數帆專注於高性能網絡技術預研和產品化落地,帶領團隊完成 VPC 網絡 / 容器網絡 / 服務網格 / 存儲 /P4 網關等多個場景下的高性能網絡套件在網易集團內部落地以及商業化輸出工作。
微軟裁員內幕
Angular 重磅回歸
安息吧,元宇宙
裁錯了還是變相降薪?大廠粗暴裁員後又求員工回來,網友:拿什麼再愛你?