網路虛擬化中的 offload 技術:LSO/LRO、GSO/GRO、TSO/UFO、VXLAN
原文:http://blog.csdn.net/yeasy/article/details/19204639
offload
現在,越來越多的網絡卡裝置支援 offload 特性,來提升網路收/發性能。offload 是將本來該作業系統進行的一些資料包處理(如分片、重組等)放到網絡卡硬體中去做,降低系統 CPU 消耗的同時,提高處理的效能。
包括 LSO/LRO、GSO/GRO、TSO/UFO 等。
LSO/LRO
分別對應到傳送和接收兩個方向,是 Large Segment Offload 和 Large Receive Offload。
首先來看 LSO。我們知道計算機網路上傳輸的資料基本單位是離散的網包,既然是網包,就有大小限制,這個限制就是 MTU(Maximum Transmission Unit)的大小,一般是1518位元組。比如我們想傳送很多資料出去,經過os協議棧的時候,會自動幫你拆分成幾個不超過MTU的網包。然而,這個拆分是比較費計算資源的(比如很多時候還要計算分別的checksum),由 CPU 來做的話,往往會造成使用率過高。那可不可以把這些簡單重複的操作 offload 到網絡卡上呢?
於是就有了 LSO,在傳送資料超過 MTU 限制的時候(太容易發生了),OS 只需要提交一次傳輸請求給網絡卡,網絡卡會自動的把資料拿過來,然後進行切,並封包發出,發出的網包不超過 MTU 限制。
接下來看 LSO,當網絡卡收到很多碎片包的時候,LRO 可以輔助自動組合成一段較大的資料,一次性提交給 OS處理。
一般的,LSO 和 LRO 主要面向 TCP 報文。
GSO/GRO
Generic Segmentation Offload 和 Generic Receive Offload,分別比 LSO 和 LRO 更通用,自動檢測網絡卡支援特性,支援分包則直接發給網絡卡,否則先分包後發給網絡卡。新的驅動一般用 GSO/GRO。
TSO/UFO
TCP Segmentation Offload 和 UDP fragmentation offload,分別對應 TCP 報文和 UDP 報文。
很典型的,TCP 協議中就考慮了分片存在的情況,往往是切分 TCP 的資料包,叫做 TSO。而一般的情況,則稱為 LSO 或者 GSO。
對於其他不支援切片的協議例如 UDP,則只能進行 IP 層上的切片。
檢查與開關
可以通過 ethtool -k eth0
命令來檢視各個選項的當前狀態,注意輸出中各種 off-load 選項的狀態。
# ethtool -k eth0 Features for eth0: rx-checksumming: on tx-checksumming: on tx-checksum-ipv4: on tx-checksum-ip-generic: off [fixed] tx-checksum-ipv6: on tx-checksum-fcoe-crc: off [fixed] tx-checksum-sctp: off [fixed] scatter-gather: on tx-scatter-gather: on tx-scatter-gather-fraglist: off [fixed] tcp-segmentation-offload: on tx-tcp-segmentation: on tx-tcp-ecn-segmentation: off [fixed] tx-tcp6-segmentation: on udp-fragmentation-offload: off [fixed] generic-segmentation-offload: on generic-receive-offload: on large-receive-offload: off [fixed] rx-vlan-offload: on tx-vlan-offload: on ntuple-filters: off [fixed] receive-hashing: on highdma: on [fixed] rx-vlan-filter: on [fixed] vlan-challenged: off [fixed] tx-lockless: off [fixed] netns-local: off [fixed] tx-gso-robust: off [fixed] tx-fcoe-segmentation: off [fixed] tx-gre-segmentation: off [fixed] tx-ipip-segmentation: off [fixed] tx-sit-segmentation: off [fixed] tx-udp_tnl-segmentation: off [fixed] tx-mpls-segmentation: off [fixed] fcoe-mtu: off [fixed] tx-nocache-copy: on loopback: off [fixed] rx-fcs: off [fixed] rx-all: off tx-vlan-stag-hw-insert: off [fixed] rx-vlan-stag-hw-parse: off [fixed] rx-vlan-stag-filter: off [fixed] l2-fwd-offload: off [fixed]
通過 ethtool -K eth0 gso off/on 這樣的命令來開關。
VXLAN
VXLAN 現在已經是常見的二層虛擬化實現技術,但是由於它需要對每個資料包都進行封裝、解封裝等操作,導致基於軟體的解決方案效率不高。 現在已經有網絡卡開始支援對 VXLAN 進行一些輔助操作,包括封裝、解封裝,以及 checksum 計算等。
網路虛擬化
那麼,這些 offload 技術,跟虛擬化有什麼聯絡呢?
在網路虛擬化中,一個最常見的技術就是隧道,這是實現overlay的通用手段。而實現隧道無非就兩種思路,一種是把轉發資訊放到包頭上,即封裝/解封裝(無論VXLAN還是STT都是這個思路);另外一種是由額外的資料庫管理,轉發時候進行查詢。這兩種思路各有利弊,這裡不細說,如果我們採用封裝/解封裝的作法,那麼可能原來網包並沒有超過MTU限制,加上封裝包頭就超了,這就需要進行切片了。
所以 VMware 在其旗艦產品 NVP 中強調可以通過 TSO 來提高轉發效能。
當然,前提是網絡卡能夠支援,並且在os中配置開啟。
此外,多核伺服器中的網絡卡還推薦考慮 RSS(Receive Side Scaling),將網流分配到多個 RSS 佇列上,多個佇列繫結到不同的核心上,分散負載。