使用 OVS-DPDK 加速滴滴雲網絡
在基於現有 OVS-DPDK 開源軟體基礎上,滴滴雲技術團隊通過創新性的改進,實現了 ms 級別的熱升級,同時保持現有的高效能轉發能力。
背景
滴滴雲初期採⽤學習 OpenStack 的思路,採用核心態的 OVS 實現了 SDN OverLay 網路。這個實踐過程中,我們也遇到了一些問題,可以歸納為以下幾個⽅面:
- 效能不高
- ⽆法熱升級
- 開發難度⼤
- 維護成本高
原型設計
針對這些問題,經過技術調研,也參考了國內外同⾏的已有解決方案,在過程中和 Intel 團隊緊密合作,我們採用 OVS-DPDK 進⾏開發部署,並最終取得了不錯的效果。如下是資料流模型:
資料層面的⼏個重要改造
1. 底層:⽹卡硬體相關
基於 VF 的資料流改造
藉助硬體將 OverLay 的流量與宿主機的其他⽹絡流量進⾏分離。通過 flow classification 命令將前者導⼊到 VF 上,而後者仍然是通過 PF 口到核心進行處理,保持原有處理邏輯不變。OVS- DPDK 只接管 VF ⽹口,⽽不觸碰 PF 口上的非 SDN OverLay ⽹絡流量。
這樣既簡化了 OVS-DPDK 的處理邏輯,同時也避免了因 OVS-DPDK 本身的穩定性,而影響其他⾮ SDN ⽹絡模組的穩定性。
2. 中間層:OVS 報⽂處理
無狀態的轉發功能
⽬前,我們對計算節點⽹絡層面的需求,可以分為兩大類:VM 流量的轉發和 VM 網路的安全監控。其中後者是內部開發的,暫時略過。
針對 VM 流量轉發的這個需求,⼜拆解為兩部分:OverLay 外層頭的處理和內層報文的轉發。
藉助 OVS-DPDK 的 flow 表實現這兩部分功能。因為沒有啟⽤ conntrack 功能,因此我們這部分的實現是⽆狀態的。這個拆解,特別是無狀態的特性,在熱升級的時候取得了不錯的效果。
OVS 單網橋
之前參考 OpenStack 的模型,我們使⽤了 br-int,br-tunnel 兩個網橋。在這個模型裡,OVS ⽹橋的使⽤方式跟傳統的 Bridge 使⽤⽅式差別不大,沒有充分發揮 OVS ⽹橋的優勢。
在我們的模型中,把兩個網橋整合為一個網橋,將 VXLAN ⼝和 vhost-user 的⼝都放到⽤⼀個網橋上。VM 發出的報⽂經過 OVS 轉發處理後,攜帶外層頭資訊進入 VXLAN 驅動,經過 VXLAN 網口的封裝後,傳送給 VF 網口。
根據我們的資料模型,進入 VF ⼝的報⽂只可能是發往 VM 的 VXLAN 型別的報文。這些報文,在被剝除 VXLAN 頭後,經過 VXLAN ⼝進⼊網橋,經過⽹橋轉發到各個 VM 的 VPORT 。
降低與核心的耦合性
原有的 OVS 橋的路由和 ARP 表需要去核心查詢,跟核心的耦合性很強。
我們通過 SDN 控制器下發到 OVS-DPDK,來規避直接與核心的互動。這樣⼀方⾯簡化了 Bridge 的配置(不用單獨設定IP地址等),降低了核心的耦合性,另⼀方⾯也降低了熱升級時候的複雜度。
3. 上層: vhost-user 與 VM 互動層
vhost-user增強
我們使用的是 QEMU 作為 vhost-user 的 Server 端,OVS-DPDK 程序通過 unixsocket 連線到 QEMU。QEMU 預設僅支援一個這樣的連線,改造 QEMU 後,使得 QEMU 支援兩個主備倒換的連線,這樣熱升級的時候,可以通過控制 OVS-DPDK 端的開關,輕鬆的在新⽼兩個程序間切換。
記憶體模型採用 2M/4k。
儘量減少對現有 VM 的影響,為以後升級和遷移做準備。
方案優勢
- 升級時間短:業內⽬前的熱升級方案基本都是秒級的,切換時間⽐較長。而在我們的框架下,每個VM的熱升級時間大約 80ms 左右,極大的縮短了 VM 的網路中斷時間,基本做到⽤戶無感知。
- 可擴充套件性好:熱升級過程中,VM ⽹絡中斷時間跟 VM 規模無關。熱升級的時候,我們逐個把 VM 的流量從⽼的 OVS-DPDK 程序裡,切換到新的程序裡。這種逐個切換的模式,使得單個 VM 的流量切換,不會影響其他的 VM 網路功能。即使上百個 VM,總的升級時間達到⼏秒甚至⼏十秒的情況下,單個 VM 的⽹絡中斷時間仍然是 80ms。
- 故障恢復快:我們熱升級的模型中採⽤的是兩個獨⽴的 OVS-DPDK 程序,因此提前啟動一個新的 OVS-DPDK 程序作為後備程序,這個程序完成所有熱升級相關的初始化,比如初始化 vf2。這樣當原有 OVS-DPDK 程序 Crash 後,新的程序可以做快速的切換,實驗室環境下,單 VM 測試可以做到跟熱升級時間差不多。
附上測試資料
- 效能:單核效能 400wpps 左右
- 熱升級:單 VM 網路中斷時間 80ms 左右
- DPDK version:17.11
- OVS version:2.9.0
- QEMU version:2.9
- CPU:Intel® Xeon® CPU E5-2630 v4 @ 2.20GHz kernel:3.10.0-514.16.1.el7.x86_64
- NIC:Ethernet Controller X710 for 10GbE SFP+ 1572