絡:FPGA智能網(wǎng)卡如何重塑數(shù)據(jù)中心數(shù)據(jù)面)
幾個月前我調(diào)一個分布式存儲集群單看CPU使用率只有百分之十幾可業(yè)務就是跑不滿帶寬。抓包一看網(wǎng)卡中斷幾乎全打在一個核上軟中斷和協(xié)議棧處理直接把那個核壓垮了其他核想幫忙也插不上手。換了一塊支持多隊列的網(wǎng)卡緩解了一些可數(shù)據(jù)一上來還是扛不住。后來我們把存儲報文處理的核心邏輯從CPU挪到智能網(wǎng)卡上問題才算真正解決。這篇文章不打算講太多概念層面的東西就圍繞我最近折騰的FPGA智能網(wǎng)卡、鳴鏑這類產(chǎn)品化網(wǎng)卡以及數(shù)據(jù)中心的RDMA無損網(wǎng)絡聊聊它們到底解決了什么問題又該怎么選型。1. 智能網(wǎng)卡到底解決了什么問題從一次CPU被打滿的排障說起1.1 傳統(tǒng)網(wǎng)卡的工作模式為什么開始撐不住傳統(tǒng)網(wǎng)卡的活兒其實很單一收包的時候把數(shù)據(jù)通過DMA搬進內(nèi)存然后發(fā)中斷通知CPU“包到了”發(fā)包的時候從內(nèi)存把數(shù)據(jù)搬出去按MAC地址發(fā)到鏈路上??雌饋砗唵慰蓡栴}就出在收包之后的那一長串流程上——校驗和、協(xié)議解析、路由查詢、Netfilter鉤子、協(xié)議棧處理、socket隊列再到用戶態(tài)拷貝全套下來全是CPU在干活。25G時代這種模式還勉強能撐到了100G就徹底繃不住了。咱們可以粗略算一筆賬100Gbps線速下如果全是64字節(jié)小包大約每秒要處理1.48億個包。一顆主流服務器CPU跑到3GHz單核每秒大概有30億個時鐘周期攤到每個包上只有20個周期左右??墒且粋€DMA描述符處理加校驗都不止20個周期更別提后面還有一長串協(xié)議棧邏輯。換句話說一個核早就被數(shù)據(jù)面吃干榨凈了。虛擬化場景更嚴重。虛擬機的網(wǎng)絡不是直接懟到物理網(wǎng)卡上的中間還隔著一層虛擬交換機。每個包從虛擬機出來要先經(jīng)虛擬交換機做轉發(fā)決策、查安全組規(guī)則、做VXLAN封裝然后才從物理口出去。這一套操作比物理機收包還重所有開銷都實打?qū)崝傇谒拗鳈CCPU上。我們當時那個存儲集群就是這種狀態(tài)存儲節(jié)點之間跑RDMA協(xié)議中斷處理不均勻某一個核被打滿整個集群的吞吐就卡在那一兩個核上。1.2 卸載的本質(zhì)把“數(shù)據(jù)搬運和協(xié)議處理”從CPU手里拿走智能網(wǎng)卡的思路說起來特別樸素既然CPU干數(shù)據(jù)面不劃算那就把這些重復性的、固定模式的活兒放到網(wǎng)卡上干。網(wǎng)卡上原本就有DMA引擎現(xiàn)在再加上硬件解析、流表匹配、封裝解封裝、擁塞控制、加密卸載這些模塊CPU只負責下發(fā)規(guī)則和收控制面消息。這就是“卸載”的核心邏輯。不過這中間有個易混淆的概念不是所有卸載都叫智能網(wǎng)卡。普通網(wǎng)卡也有校驗和卸載、TSO/GRO這些功能但它們只是把某個固定操作微加速規(guī)則和邏輯都焊死在芯片里。智能網(wǎng)卡的區(qū)別在于可編程性——你可以定義新的轉發(fā)規(guī)則、修改協(xié)議頭處理流程、加載新的擁塞控制算法。從這個角度智能網(wǎng)卡更像是一個放在網(wǎng)卡位置上的專用處理系統(tǒng)而不只是一個I/O設備。如果用快遞來打比方傳統(tǒng)網(wǎng)卡相當于每個快遞員收發(fā)件時都要自己查地圖、手動填面單、逐個繞路配送智能網(wǎng)卡則相當于一個分揀中心快遞一進來自動掃描、按規(guī)則分揀、規(guī)劃路線還能隨時更新分揀規(guī)則。CPU從“親手送快遞”變成“制定規(guī)則、處理異常件”效率自然是另一個量級?,F(xiàn)在市面上的智能網(wǎng)卡方案大概分三類一類是固定加速的ASIC網(wǎng)卡把幾類熱門卸載做成硬件邏輯性能功耗都很好但不能改邏輯一類是FPGA智能網(wǎng)卡邏輯可以反復配置適合還沒完全定型的場景還有一類是帶多核CPU的DPU網(wǎng)卡能跑完整的控制面協(xié)議?;揪褪且慌_小服務器掛在PCIe槽上。三類各有各的舒服區(qū)后面會專門算賬。2. FPGA智能網(wǎng)卡為什么說網(wǎng)絡處理天生適合“可重寫的硬件”2.1 FPGA的流水線結構與包處理天然匹配好多朋友一聽到FPGA就發(fā)怵覺得那是硬件工程師的地盤。實際上從網(wǎng)絡從業(yè)者的角度看把FPGA理解成一個可以反復改接線的大規(guī)模并行邏輯陣列就行。它最核心的優(yōu)勢不是某個單獨模塊跑得快而是整條數(shù)據(jù)通路可以做到所有環(huán)節(jié)同時工作——包從進去那一刻開始解析、查表、轉發(fā)、封裝、發(fā)送就是在一條流水線上并行的。網(wǎng)絡包處理恰恰就是這種高度流水化的計算。一個包進來先查協(xié)議類型再提取五元組然后匹配流表按規(guī)則做QoS和封裝最后從出口發(fā)出去。每一步都依賴上一步的結果但不同包之間完全獨立。這種場景CPU處理起來效率很低因為CPU是“取指—譯碼—執(zhí)行”的串行模型一個核同時在跑的上下文也就那么幾個還得不停做分支預測。FPGA則可以把流水線的每一級做成獨立硬件上一級還沒算完下一級已經(jīng)開始處理前一幀的尾部了。我在實際調(diào)測里的感受是FPGA網(wǎng)卡在處理64字節(jié)小包時的延遲穩(wěn)定性比同級別通用CPU方案要穩(wěn)得多延遲抖動基本可以忽略。2.2 FPGA網(wǎng)卡上真正值錢的幾個加速模塊一塊FPGA智能網(wǎng)卡上真正承擔業(yè)務的其實是下面這幾個模塊可編程解析器支持自定義報文格式不只是標準以太網(wǎng)/IP/TCP還能直接解析RoCE、NVMe-oF這類特定協(xié)議字段。這是相比固定ASIC最大的自由度。多級流表匹配用哈希、基于塊內(nèi)存的匹配邏輯做五元組/連接級別的查表。按精確匹配、最長前綴匹配分級規(guī)則變更是下發(fā)到硬件刷新不用動數(shù)據(jù)通路。流調(diào)度器按優(yōu)先級、隊列、流的速率做整形和擁避。無損網(wǎng)絡的優(yōu)先級流控參數(shù)也是在這里生效。線速加密和摘要IPsec、MACsec的加解密、完整性校驗能卸到FPGA邏輯里省掉CPU的加密開銷。硬件時間戳在數(shù)據(jù)通路里直接給每個包蓋上納秒級時間戳這個對網(wǎng)絡監(jiān)控和延遲測量特別有用。我自己剛接觸時最直觀的感受是FPGA網(wǎng)卡的“可編程”不像CPU軟件那樣寫個函數(shù)就能改邏輯而是通過加載不同的比特流或規(guī)則表來生效。好在鳴鏑這類產(chǎn)品化網(wǎng)卡已經(jīng)把常用的卸載功能封裝好了我們不需要真去寫Verilog按它提供的接口下發(fā)規(guī)則表就行FPGA的靈活性和用戶的開發(fā)成本之間取了一個平衡。2.3 三種智能網(wǎng)卡方案到底怎么選看靈活性也看總成本經(jīng)常有朋友問我FPGA網(wǎng)卡是不是一定比ASIC網(wǎng)卡好真不是。選型本質(zhì)上是拿靈活性換功耗和成本。我習慣用下面這張表來說事維度FPGA智能網(wǎng)卡ASIC固定功能網(wǎng)卡多核SoC DPU可編程性邏輯級可重寫規(guī)則和流程都能改只有參數(shù)能調(diào)邏輯流片后定型軟件可編程生態(tài)最豐富數(shù)據(jù)面性能高延遲確定性強最高功耗最優(yōu)取決于核數(shù)和加速器配合開發(fā)周期硬件迭代一次幾周流片周期數(shù)月到一年軟件開發(fā)迭代最快單卡成本較高適合批量但非海量大規(guī)模量產(chǎn)單卡成本低中高CPU核本身也值錢適用場景協(xié)議還在演進、需要快速跟隨標準成熟、量非常大的場景需要復雜控制面邏輯的卸載說實話數(shù)據(jù)中心無損網(wǎng)絡這塊目前正好處在協(xié)議參數(shù)還在調(diào)整的階段。DCQCN的參數(shù)怎么配、PFC是否全局開啟、ECN閾值設多少不同廠商都有各自的推薦值。ASE方案一旦流片這些細節(jié)基本就固定了FPGA方案則可以隨著算法迭代重新配置這是它現(xiàn)在被重視的很關鍵的原因。當然如果哪天無損網(wǎng)絡和智能網(wǎng)卡的功能完全標準化了ASIC的優(yōu)勢會重新凸顯。3. 鳴鏑這類FPGA智能網(wǎng)卡產(chǎn)品化之后業(yè)務端拿到的是什么3.1 鳴鏑系列網(wǎng)卡在產(chǎn)品層面的幾個看點鳴鏑這個系列最近在圈子里討論比較多按公開資料來看它屬于典型的FPGA智能網(wǎng)卡產(chǎn)品化路線。硬件上通常是PCIe 4.0或5.0形態(tài)雙25G或雙100G端口板載大容量內(nèi)存用來做流表和緩沖隊列FPGA邏輯里集成了包解析、流表匹配、隧道封裝、RDMA和擁塞控制相關的硬件模塊。相比一塊裸FPGA開發(fā)板鳴鏑這類產(chǎn)品的價值在“打包好了”。網(wǎng)卡管理工具、驅(qū)動、固件升級機制、調(diào)試接口都是現(xiàn)成的用戶拿到手不是面對一堆邏輯代碼而是通過一套協(xié)議直接下發(fā)流表規(guī)則、配置QoS、查看統(tǒng)計計數(shù)。網(wǎng)絡工程師可以用自己熟悉的那套“下發(fā)規(guī)則—看計數(shù)器—調(diào)參數(shù)”的方法來使用它而不需要懂硬件描述語言。從卸載范圍看鳴鏑覆蓋了云數(shù)據(jù)中心最常見的那幾類卸載OVS流表卸載、VXLAN/GRE封裝卸載以及RoCEv2所需的ECN識別和流控配合。這幾個點正好是純CPU方案最吃力的地方也是無損網(wǎng)絡落地最核心的環(huán)節(jié)。3.2 實測下來感受最明顯的三個場景我自己目前在模擬環(huán)境里調(diào)過類似定位的FPGA智能網(wǎng)卡三個場景印象比較深。第一個是云主機網(wǎng)絡卸載。沒卸載之前虛擬交換機每轉發(fā)一個包都要CPU參與規(guī)則多了之后CPU占用像坐過山車。把OVS流表下發(fā)到網(wǎng)卡后數(shù)據(jù)面直接走硬件匹配轉發(fā)宿主機CPU占用立刻掉了一大截。最讓我意外的是規(guī)則變更時的表現(xiàn)流表下發(fā)到FPGA是增量刷新不是把整張表重來一遍業(yè)務流量幾乎無感。第二個是存儲和AI訓練的RoCE場景。分布式存儲節(jié)點之間跑RDMA時一個很頭疼的問題是PFC和ECN參數(shù)配不好就會掉速。FPGA網(wǎng)卡上這些參數(shù)可以直接通過寄存器調(diào)而且ECN標記是在數(shù)據(jù)路徑里由硬件判斷的不像軟件方案那樣需要靠采樣來近似。調(diào)完之后AI訓練這類長尾通信的尾延遲明顯變得穩(wěn)定。第三個場景可能很多人沒意識到就是網(wǎng)絡可視化和安全過濾。FPGA可以在線速下做包頭和負載特征匹配把特定流量鏡像到分析端或者在硬件層直接丟掉惡意報文。這在CPU方案里幾乎不可能做到線速但FPGA天然就是干這個的。3.3 產(chǎn)品化網(wǎng)卡同樣要付出的隱性代價用了幾周之后我也得說實話產(chǎn)品化FPGA網(wǎng)卡不是零成本方案。首先是驅(qū)動和固件的配套。FPGA邏輯越靈活驅(qū)動和固件的版本匹配就越敏感。我們遇到過升級固件后舊驅(qū)動異常業(yè)務斷連的情況最后只能按“固件和驅(qū)動必須同批驗證”的規(guī)矩來管理。其次是管理接口的成熟度。產(chǎn)品化網(wǎng)卡的管理工具通常能覆蓋絕大多數(shù)需求但真要到做深度調(diào)試的時候還是得翻廠商提供的寄存器級文檔。再有一個容易被忽略的功耗和散熱。FPGA的邏輯規(guī)模上去了功耗比同端口的固定功能網(wǎng)卡高不少。單臺服務器如果插兩塊供電和散熱就得提前做評估。這些成本不會出現(xiàn)在產(chǎn)品宣傳頁上但會在你部署的時候一點一點“找補”回來。4. 無損網(wǎng)絡的真相PFC、ECN與智能網(wǎng)卡之間其實是三方博弈4.1 RDMA為什么必須追求“無損”先從一個基礎問題說起RDMA為什么對丟包這么敏感傳統(tǒng)TCP丟包后走重傳、擁塞窗口退避雖然延遲升高但總歸能恢復。而RDMA為了降低延遲把數(shù)據(jù)通路上的重傳和擁塞處理減到最輕很多實現(xiàn)甚至依賴無損網(wǎng)絡來保證不丟包。一旦某個包丟了接收端遲遲等不到數(shù)據(jù)整個傳輸就可能等上很長時間才觸發(fā)超時代價是微秒級的性能瞬間掉到毫秒級差距上千倍。所以無損網(wǎng)絡不是一個“金字招牌”它是RDMA能夠成立的前提。為了讓網(wǎng)絡不丟包傳統(tǒng)思路就是用流控把壓力往上游推推到源頭讓它降速。這聽起來很合理但真做起來全是坑。4.2 PFC看似簡單的逐跳反壓挖了哪些坑PFC優(yōu)先級流控的原理就是每跳交換機和網(wǎng)卡都監(jiān)控自己隊列的長度超過閾值就向上一跳發(fā)暫停幀讓對端暫時停發(fā)該優(yōu)先級的流量。一層一層推上去最后讓發(fā)送端降速。這個機制本身沒有大問題坑全在工程實現(xiàn)里。最典型的是隊頭阻塞某個擁塞隊列觸發(fā)了反壓暫停幀會把同一優(yōu)先級上的所有流都擋在后面哪怕這些流根本不經(jīng)過擁塞點。我見過一臺混跑AI訓練和普通業(yè)務的交換機上一條訓練流的突發(fā)流量把同優(yōu)先級里所有流全部堵死連監(jiān)控流量都跟著遭殃。PFC風暴更是運維噩夢配置里任何一個環(huán)節(jié)出錯暫停幀就會在環(huán)網(wǎng)里循環(huán)傳播整個機房的該優(yōu)先級流量全部癱瘓排查難度極高。所以現(xiàn)在做無損網(wǎng)絡的人對PFC基本是“能不開就不開必須開就限制范圍”。把優(yōu)先級流控當作最后一道防線而不是主要手段這個觀念上的轉變很重要。4.3 ECN和DCQCN則是更聰明的“有損折中”為了少依賴PFC現(xiàn)在無損網(wǎng)絡的主流做法是端到端擁塞控制。核心思想是交換機不直接掐斷流量而是在隊列深度超過閾值時給報文打上ECN標記。接收端網(wǎng)卡收到帶標記的報文后生成擁塞通知包發(fā)回給發(fā)送端發(fā)送端據(jù)此快速降速。這一套在RoCEv2里對應的就是DCQCN。算法細節(jié)當然比這段文字復雜得多什么時候標記、降速比例多大、什么時候升速、CNP包的生成頻率怎么控制每個參數(shù)都會影響真實業(yè)務吞吐。這恰恰是FPGA智能網(wǎng)卡發(fā)揮價值的地方——ECN標記的識別需要在線速下做毫秒級的延遲都會影響算法效果而擁塞控制參數(shù)的調(diào)節(jié)則需要靈活因為算法還在持續(xù)演進。固定功能的ASIC在流片那一刻就把這些邏輯定型了而FPGA的邏輯可以重新配置。我們的實際感受是這塊的可迭代性比紙面上的性能參數(shù)更重要因為你永遠不知道下一次算法優(yōu)化會改成什么樣。4.4 智能網(wǎng)卡在無損網(wǎng)絡里實際承擔的活把角色拆開看智能網(wǎng)卡在無損網(wǎng)絡里承擔的事情有三塊流控參數(shù)的硬件卸載PFC的暫停閾值、ECN標記閾值、速率限制器全部由網(wǎng)卡硬件執(zhí)行CPU只負責初始化和動態(tài)調(diào)整。參數(shù)下發(fā)之后即使CPU被業(yè)務打滿流控依然有效。線速ECN識別和標記交換機打上的ECN標記接收端網(wǎng)卡要在收包的第一時間識別并決定是否生成CNP。這個操作做慢了擁塞窗口就調(diào)整晚了。PFC統(tǒng)計與死鎖檢測網(wǎng)卡維護每個優(yōu)先級的暫停幀收發(fā)統(tǒng)計出現(xiàn)異常時及時上報。這些計數(shù)器是排查PFC風暴最重要的依據(jù)。鳴鏑這類FPGA網(wǎng)卡在無損網(wǎng)絡里的價值就在于它開箱就帶這些硬件邏輯同時保留了“未來算法升級時重新配置邏輯”的可能。這比單純買一塊固定功能的RoCE網(wǎng)卡要穩(wěn)妥得多。用我們團隊內(nèi)部的話來說無損網(wǎng)絡不是“配置”出來的一次性結果而是需要持續(xù)調(diào)優(yōu)和演進的動態(tài)過程。5. 選型與落地到底什么樣的組合才是“最優(yōu)解”5.1 按業(yè)務場景對號入座別問“哪個最好”要問“哪個適合”經(jīng)常有人問“買FPGA智能網(wǎng)卡是不是一步到位”。我的回答是沒有一步到位只有場景適配。下面是我自己整理的一個粗粒度選型表業(yè)務場景核心訴求推薦方案理由HPC高性能計算超低延遲、固定路徑通信成熟RoCE網(wǎng)卡優(yōu)先ASIC通信模式固定、追求極致性能功耗AI訓練集群長尾流量、突發(fā)嚴重、需持續(xù)調(diào)優(yōu)FPGA智能網(wǎng)卡支持ECN參數(shù)自定義擁塞算法還在演進需要靈活迭代分布式存儲吞吐優(yōu)先數(shù)據(jù)面卸載FPGA智能網(wǎng)卡RoCEv2卸載存儲協(xié)議卸載收益最直接云主機大規(guī)模虛擬化OVS卸載、多租戶隔離帶OVS卸載的智能網(wǎng)卡流表頻繁變化需要可編程匹配通用Web/業(yè)務成本敏感、流量相對平穩(wěn)固定功能網(wǎng)卡CPU調(diào)優(yōu)FC網(wǎng)卡性價比最優(yōu)這個表不是絕對的但能反映出核心邏輯流量模式越穩(wěn)定、協(xié)議越標準越應該選ASIC固定功能流量突發(fā)越強、協(xié)議越不成熟越需要FPGA這類可編程方案。5.2 成本賬智能網(wǎng)卡的錢花得值不值咱們可以算一筆很粗略的賬。一臺雙路服務器如果要支撐100G網(wǎng)絡并做OVS轉發(fā)和RoCE處理純CPU方案往往要預留4到6個物理核給網(wǎng)絡數(shù)據(jù)面。一顆28核的CPU那相當于損失了七分之一左右的算力。如果跑的是云主機業(yè)務這些核占著的成本一直存在很浪費。智能網(wǎng)卡把數(shù)據(jù)面卸載之后這幾個核可以釋放跑業(yè)務虛擬機。按一臺服務器的生命周期和核數(shù)來折算一塊智能網(wǎng)卡多花的幾萬元成本通常能在一年左右從業(yè)務部署密度提升上賺回來這筆賬在測試環(huán)境里跑一遍就能算清楚。當然如果要跑的場景只是少量收發(fā)包智能網(wǎng)卡的優(yōu)勢就體現(xiàn)不出來這時候也沒必要上。5.3 部署和調(diào)優(yōu)時容易踩的坑提前幫你排掉最后說幾個我們自己踩過、周邊同行也常踩的坑。第一驅(qū)動和固件的版本配套關系一定要固化。FPGA網(wǎng)卡邏輯可更新固件升級后驅(qū)動不匹配會有兼容性問題升級前必須看官方配套表升級后立刻做回歸測試。我們現(xiàn)在的規(guī)矩是生產(chǎn)環(huán)境能不動固件就不動。第二BIOS里的PCIe配置別漏。智能網(wǎng)卡要發(fā)揮性能PCIe鏈路寬度和速率必須配夠SR-IOV、IOMMU相關選項也要按產(chǎn)品手冊打開。曾經(jīng)遇到性能只有預期一半的情況查了半天最后發(fā)現(xiàn)PCIe被BIOS自動協(xié)商到了x4不是x16。第三PFC和ECN參數(shù)不要一把梭。無損網(wǎng)絡的配置要按業(yè)務流量模型來定不同優(yōu)先級配不同的緩沖策略PFC能不開就不開優(yōu)先級范圍越小越好。調(diào)完一定要跑一輪長時壓測看PFC暫停幀計數(shù)有沒有異常增長我見過不少“配置看著合理、跑了半小時就開始丟包”的案例。最后我直接分享一點自己的體會。我一開始也懷疑智能網(wǎng)卡是不是就是高級一點的卸載卡真正調(diào)完RDMA和PFC之后才明白在無損網(wǎng)絡這件事上網(wǎng)卡端的靈活性和可編程能力比想象中重要。FPGA方案看起來功耗高一點、門檻也高一點但遇到PFC風暴、新?lián)砣惴ㄟ@類問題你會慶幸自己選了一塊能改邏輯的卡。如果你正在折騰數(shù)據(jù)中心網(wǎng)絡建議先跑通一套標準的流量模型再考慮上智能網(wǎng)卡如果預算允許優(yōu)先選支持RoCEv2卸載和流表可編程的方案。這個方向變化很快早一點自己動手試試比看多少文章都有用。