當前智能網卡已經從10G時代邁入25G時代,並且向50G/100G時代演進。雲化帶來的每年的增量是非常客觀的,Mellanox/Broadcom等廠商之間的競爭也很激烈。降成本,提性能,是個永恆的話題。
在相關性能技術支撐中,多隊列是很重要的一環。它源起處理器的多核技術帶來的並行挑戰,后來加入QoS和虛擬化技術的支持。利用多隊列和流分類,可以達到更為高效的IO處理。基本上目前主流的技術,都要跟多隊列打交道,比如:virtio,nvme,nvmeof,rdma等等。
本文關注多隊列的通用技術和優化權衡,分為三個部分。
第一部分先理一下網卡的通用處理和框架。
第二部分深入下Tx發包方向的隊列mapping選擇和分發。
第三部分深入下Rx收包方向的預解析/流分類/過濾/分發。
簡單描述下第一部分。網卡根據報文流向可以分為入向(Ingress)和出向(Egress)兩個方向。
01
—
NIC報文入向框圖
Ingress方向框圖如下:
(1) 接口測
在目前的data center中,主要有如下接口:
l 1G-SFP-AOC/1G-SFP-DAC
l 10G-SFP+-AOC/10G-SFP+-DAC
l 25G-SFP28-AOC/25G-SFP28-DAC
l 100G-QSFP28-AOC/100G-QSFP28-DAC
光模塊的適配/兼容是個重點,link/CRC錯誤/MAC過濾等系列問題會時常遇到。性能第一步的MAC收發包統計計數是必備的工具。
(2) Parser/整包
報文從接口測經過物理層和MAC層,一般對應內部會map到FIFO層。后續的處理,為了提高效率,一般都會分為並行的兩個方向:
l Parser。硬件可以解析報文頭,根據提取信息,比如五元組或者其他預解析字段,作為后面流分類和分發的key值。這部分有的NIC是固化的寄存器,解析L2/L3/L4等有限;有些功能強大的會配合一個微處理器,增強解析功能。如果無法解析的報文,只能到后端的CPU來進行分析處理。如果前端parser越強,那么后端的CPU的處理就會越少,節省的cycles可以用於轉發性能提升。
l DMA。真正的報文要實現整包的處理,dma到指定的buffer中。
也就是報文的控制和數據通道是分離的。這個擴展到具體應用場景,可以配合后續的QoS模塊等實現控制通道和數據通道的分離,防止線頭阻塞(HOL)等。
(3) 流分類/過濾/分發
因為有多隊列,那么就要面臨如何選擇隊列的問題,也就是mapping。Parser提取字段可以作為流分類的基礎,這里有兩種技術:RSS和Flow Director。RSS是根據hash散列到指定目的地,flow director是精確匹配。有些NIC比較簡單,片上TCAM作為flow director的表向,只能支持幾個條目;有些功能比較強,那么可以支持幾K甚至通過spill技術用到DRAM來補充片上資源的不足。但就其本質而言,還是查表來選擇drop/組播復制/出端口發送。
對於智能網卡而言,這一部分也是技術的重心。在轉發性能保障的情況下,flow支持的越多,offload能夠做的事情越多,對后端CPU的壓力就越小。所以,該部分技術核心在於業務模型的熟悉和理解,ULP抽象層要盡可能的支持度廣,NIC硬件驅動做好底層適配。
(4) 分發到CPU,可以增加軟件隊列,實現負載均衡或者QoS,以彌補硬件NIC無法支持的功能。這里的RPS技術就可以配合使用。
02
—
NIC報文出向框圖
Egress方向框圖如下:
(1) 發送端的隊列選擇
發送測和接收測類似,可以實現軟件隊列到硬件隊列的mapping。軟件隊列可以根據需求實現硬件無法支持的部分功能。這里Linux和DPDK的隊列選擇機制是不相同的,后面根據代碼分析。一般是由應用來提供靈活的隊列選擇機制,可以根據driver制定的策略,也可以根據隊列優先級,也可以hash均衡,也可以1:1映射。XPS就是對應此處的一項技術,用於transmit flow steering。
(2) Egress engine
可以硬件實現TSO等來加速。各個NIC支持的功能均不相同。
(3) QoS調度
Egress方向的調度模型示例如下:
(4) 保序
有些實現了硬件保序,有些沒有。如果沒有的情況下,全路徑根據flow進入單一隊列來完成保序也是可用的方案。
總之,對於任何一個NIC而言,報文的生命周期是要了解的。對於NP等復雜NIC而言,里面的設計機制尤為復雜,需要投入較多的精力才能掌握。