網絡虛擬化中的 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 隊列上,多個隊列綁定到不同的核心上,分散負載。

發佈了15 篇原創文章 · 獲贊 9 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章