Linux性能優化(九)——Kernel Bypass

一、Linux內核協議棧性能瓶頸

在x86體系結構中,接收數據包的傳統方式是CPU中斷方式,即網卡驅動接收到數據包後通過中斷通知CPU處理,然後由CPU拷貝數據並交給內核協議棧。在數據量大時,CPU中斷方式會產生大量 CPU中斷,導致CPU負載較高。
Linux性能優化(九)——Kernel Bypass
(1)硬件中斷導致的線程、進程切換
硬件中斷請求會搶佔優先級較低的軟件中斷,頻繁到達的硬件中斷和軟中斷意味着頻繁的線程切換,隨着而來的就是運行模式切換、上下文切換、線程調度器負載、高速緩存缺失(Cache Missing)、多核緩存共享數據同步、競爭鎖等一系列的CPU性能損耗。
(2)內存拷貝
網卡驅動位於內核態,網絡驅動接收到數據包後會經過內核協議棧的處理,然後再拷貝到用戶態的應用層緩衝區.從內核態到用戶態的數據拷貝是耗時操作,數據拷貝的時間會佔數據包處理流程時間的50%以上。
(3)多處理器平臺CPU漂移
一個數據包可能中斷在CPU0,內核態處理在CPU1,用戶態處理在 CPU2,跨多個物理核(Core)處理會導致大量的 CPU Cache命中缺失,造成局部性失效。對於NUMA架構,還會出現跨NUMA節點的內存訪問,極大地影響CPU性能。
(4)緩存失效
傳統服務器大多采用頁式虛擬存儲器,內存頁默認爲4K的小頁,在存儲空間較大的處理機上會存在大量的頁面映射項。同時由於TLB緩存空間有限,最終導致TLB快表的映射項頻繁變更,產生大量的TLB命中缺失。








二、Kernel Bypass簡介

1、Kernel Bypass簡介

Kernel Bypass(內核旁路)是繞過Linux內核(TCPIP協議棧)的技術,不使用Linux內核子系統的功能,採用自己實現的相同功能的代碼來處理,從用戶空間直接訪問和控制設備內存,避免數據從設備拷貝到內核,再從內核拷貝到用戶空間。
Kernel Bypass目前主流實現方案如DPDK、SolarFlare。

2、Kernel Bypass優點

Kernel Bypass技術本身爲高性能低延遲而設計,因此最大優點是高性能、低延遲。

3、Kernel Bypass缺點

Kernel Bypass技術的缺點如下:
(1)改變了現有操作系統的工作方式,很難與現有操作系統集成。
(2)由於網絡數據不經過內核網絡協議棧,相關網絡應用程序需要重新實現由操作系統提供的功能。
(3)由於操作系統沒有相關網絡硬件的控制權,操作系統提供的網絡管理部署工具不再可用。
(4)破壞了操作系統內核提供的安全性。在容器場景中,資源的抽象和隔離主要由操作系統內核提供。
(5)需要消耗1個或者多個CPU核來專門處理網絡包。




三、DPDK

1、DPDK簡介

DPDK(Data Plane Development Kit)是Intel提供的數據平面開發工具集,爲Intel Architecture處理器架構下用戶空間高效的數據包處理提供庫函數和驅動的支持,專注於網絡應用中數據包的高性能處理。
DPDK應用程序是運行在用戶空間上利用自身提供的數據平面庫來收發數據包,繞過Linux內核協議棧對數據包處理過程。Linux內核將DPDK應用程序看作是一個普通的用戶態進程,包括編譯、鏈接、加載方式和普通程序一樣。DPDK程序啓動後只能有一個主線程,然後創建一些子線程並綁定到指定CPU核心上運行。
DPDK(Data Plane Development Kit)是一個開源的、快速處理數據平面數據包轉發的開發平臺及接口,支持X86、ARM、Power PC硬件平臺。
Intel在2010年啓動了對DPDK技術的開源化進程,2010年9月通過BSD開源許可協議正式發佈源代碼軟件包,並於2014年4月在www.dpdk.org上正式成立了獨立的開源社區平臺,爲開發者提供支持。
DPDK提供了一個用戶態的高效數據包處理庫,通過環境抽象層、內核旁路協議棧、輪詢模式的報文無中斷收發、優化內存/緩衝區/隊列管理、基於網卡多隊列和流識別的負載均衡等多項技術,實現了在 x86處理器架構下的高性能報文轉發能力,用戶可以在Linux用戶態開發各類高速轉發應用,也適合與各類商業化的數據平面加速解決方案進行集成。
DPDK重載了網卡驅動,將數據包的控制平面和數據平面分離,驅動在收到數據包後不再硬中斷通知CPU,而是讓數據包通過內核旁路協議棧繞過Linux內核協議棧,並通過零拷貝技術存入內存,應用層的程序可以通過DPDK提供的接口讀取數據包。
DPDK數據包處理方式節省了CPU中斷時間、內存拷貝時間,並嚮應用層提供了簡單易行且高效的數據包處理接口函數,使得網絡應用的開發更加方便。但由於需要重載網卡驅動,因此DPDK目前只能用在部分採用Intel網絡處理芯片的網卡設備中。DPDK 支持的網卡列表:https://core.dpdk.org/supported/,主流使用 Intel 82599(光口)和 Intel x540(電口)。DPDK 可以將數據包處理性能最多提高十倍。在單個英特爾至強處理器上獲得超過 80 Mbps 的吞吐量,在雙處理器配置中則可將該其提高一倍。
Linux性能優化(九)——Kernel Bypass






2、DPDK原理

Linux性能優化(九)——Kernel Bypass

3、DPDK架構

Linux性能優化(九)——Kernel Bypass
在Linux Kernel中,DPDK有KNI與IGB_UIO兩個模塊,在用戶態由多個DPDK庫組成,主要包括核心部件庫(Core Libraries)、平臺相關模塊(Platform)、網卡輪詢模式驅動模塊(PMD-Natives&Virtual)、QoS庫、報文轉發分類算法(Classify)等,用戶可以使用DPDK庫開發應用程序。

4、UIO

傳統的收發數據包方式,首先網卡通過中斷方式通知Linux內核協議棧對數據包進行處理,內核協議棧先會對數據包進行合法性進行必要的校驗,然後判斷數據包目標是否爲本機的Socket,滿足條件則會將數據包拷貝一份向上遞交到用戶態Socket來處理。
爲了使得網卡驅動(PMD Driver)運行在用戶態,實現內核旁路,Linux提供了UIO(User Space IO)機制。使用UIO可以通過 read感知中斷,通過 mmap實現和網卡設備的通訊。
UIO是用戶態的一種IO技術,是DPDK能夠繞過內核協議棧,提供用戶態PMD Driver支持的基礎。DPDK架構在Linux內核中安裝了IGB_UIO(igb_uio.ko和kni.ko.IGB_UIO)模塊,以此藉助UIO 技術來截獲中斷,並重設中斷回調行爲,從而繞過內核協議棧後續處理流程,並且IGB_UIO會在內核初始化的過程中將網卡硬件寄存器映射到用戶態。
UIO實現機制是對用戶態暴露文件接口。當註冊一個UIO設備uioX 時,就會出現系統文件/dev/uioX,對UIO設備文件的讀寫就是對網卡設備內存的讀寫。


5、DPDK特點

(1)輪詢:在包處理時避免中斷上下文切換的開銷,
(2)用戶態驅動:規避不必要的內存拷貝和系統調用,便於快速迭代優化
(3)親和性與獨佔:特定任務可以被指定只在某個核上工作,避免線程在不同核間頻繁切換,保證更多的cache命中
(4)降低訪存開銷:利用內存大頁HUGEPAGE降低TLB miss,利用內存多通道交錯訪問提高內存訪問有效帶寬
(5)軟件調優:cache行對齊,預取數據,多元數據批量操作



四、XDP

1、XDP簡介

XDP(eXpress Data Path)不是一種Kernel Bypass實現方案,與Kernel Bypass實現方式完全相反,是一種依賴於eBPF的內核代碼注入技術,能夠在網絡包到達內核協議棧前對網絡包進行過濾或者處理。XDP將網絡包處理流程放到Linux內核中位於網絡協議棧前的位置,在處理網絡數據包時,不用經過網絡協議棧的複雜流程,同時又保留了操作系統控制網絡硬件的能力。
XDP是近年發展起來的一種SDN技術,目前已經完全集成到Linux Kernel中,並且還在持續的演進。
Linux性能優化(九)——Kernel Bypass

2、XDP網絡數據處理流程

Linux內核網絡棧根據iptables防火牆設置的規則決定對數據包的處理(丟棄、轉發),XDP可以在數據包剛到達網卡就丟棄數據包,所以能夠用來處理高速數據流量。
Linux性能優化(九)——Kernel Bypass

3、XDP組成

當一個數據包到達網卡,在內核網絡棧分配緩衝區將數據包內容存到sk_buff結構體前,XDP程序執行,讀取由用戶態的控制平面寫入到BPF maps的數據包處理規則,對數據包執行相應的操作,比如可以直接丟棄數據包,或者將數據包發回當前網卡,或者將數據包轉發到其它網卡或者上層的虛擬網卡(進而將數據包直接轉發給上層的容器或者虛擬機),或者將數據包傳遞給內核協議棧,再經過協議棧的逐層解析發送給用戶程序,還可以直接將數據包通過AF_XDP特殊的socket直接轉發給上層應用程序。
Linux性能優化(九)——Kernel Bypass
XDP驅動鉤子:網卡驅動中XDP程序的一個掛載點,每當網卡接收到一個數據包就會執行XDP程序;XDP程序可以對數據包進行逐層解析、按規則進行過濾,或者對數據包進行封裝或者解封裝,修改字段對數據包進行轉發等;
eBPF虛擬機:XDP程序是由用戶編寫用受限制的C語言編寫的,然後通過clang前端編譯生成BPF字節碼,字節碼加載到內核之後運行在eBPF虛擬機上,虛擬機通過即時編譯將XDP字節碼編譯成底層二進制指令;eBPF虛擬機支持XDP程序的動態加載和卸載;
BPF maps(BPF映射):存儲鍵值對,作爲用戶態程序和內核態XDP程序、內核態XDP程序之間的通信媒介,類似於進程間通信的共享內存訪問;用戶態程序可以在BPF映射中預定義規則,XDP程序匹配映射中的規則對數據包進行過濾等;XDP程序將數據包統計信息存入BPF映射,用戶態程序可訪問BPF映射獲取數據包統計信息;
eBPF程序校驗器:BPF程序校驗器在將XDP字節碼加載到內核前對字節碼進行安全檢查,比如判斷是否有循環,程序長度是否超過限制,程序內存訪問是否越界,程序是否包含不可達的指令。在程序加載到內核前靜態的分析代碼以確保代碼會crash或者損壞運行的內核。




4、XDP優點

XDP優點如下:
(1)XDP與Linux內核網絡協議棧集成,內核仍然具有對網絡硬件的控制能力,保留了內核提供的安全性,並且現有網絡配置管理工具可以直接使用。
(2)任何具備Linux驅動的網卡都可以使用XDP,只需要網卡驅動更新添加XDP的執行hook點。DPDK需要特殊硬件支持。
(3)XDP可以選擇性使用內核網絡協議棧的功能,如路由表、TCP stack。這樣可以在加速關鍵網絡數據的同時保留現有的配置接口
(4)與基於內核網絡協議棧的程序交互時,不需要重新將網絡數據包從用戶空間注入到內核空間。
(5)對於主機上運行的應用程序是透明的。
(6)支持服務不中斷的前提下動態的重新編程,可以在網絡不中斷前提下熱升級XDP程序。
(7)不需要專屬的CPU核來做包處理,低流量對應的就是低CPU使用率,相應的更加高效,且節省電力。






5、XDP使用場景

XDP的使用場景包括如下:
(1)DDoS防禦
(2)防火牆
(3)基於XDP_TX的負載均衡
(4)網絡統計
(5)複雜網絡採樣
(6)高速交易平臺





五、Solarflare

1、Solarflare簡介

Solarflare網卡支持OpenOnload網卡加速器,其Kernel Bypass實現方案如下:在用戶空間實現網絡協議棧,並使用LD_PRELOAD覆蓋目標程序的網絡系統調用,而在底層訪問網卡時依靠EF_VI庫。
Solarflare網卡提供3個層級的kernel bypass實現方案,onload不需要用戶改代碼,安裝網卡驅動後,程序使用onload庫啓動就可以,簡單易用;tcpdirect速度上比onload快一點,但需要用戶修改代碼;ef_vi會跳過所有協議棧,直接讀取網卡的某條特定的RX隊列。
Solarflare產品憑藉高性能低延遲特點已經佔領股票和期貨高頻交易硬件市場90%的份額,Solarflare X2522 plus低延遲光纖網卡廣泛用於金融證券期貨高頻交易,價格在20000RMB以上。目前Solarflare最新產品爲X2552、X2541、X2562超低延遲網卡。

2、onload

onload是Solarflare最經典的kernel bypass網絡協議棧,屬於透明kernel bypass,提供了兼容socket網絡編程的接口,用戶不需要修改自己的代碼,只需在程序啓動前preload libonload.so即可使用。

3、ef_vi

ef_vi是一個level 2的底層API,可以收發原始Ethernet幀,但沒有提供上層協議的支持。ef_vi最大的特點是zero-copy:要求用戶預先分配一些recv buffer提供給ef_vi使用,網卡收到包後會直接寫入buffer,用戶通過eventq poll接口獲得已填充數據的buffer id即可開始處理接收數據,處理完後再把buffer交還ef_vi循環使用。
ef_vi API使用起來比較複雜,且缺乏上層協議支持,但能提供最好的性能。

4、tcpdirect

tcpdirect基於ef_vi實現了上層網絡協議棧,提供了類似socket的API:zocket,能讓用戶讀寫tcp/udp的payload數據,同時也繼承了ef_vi zero-copy的特性。tcpdirect要求使用huge pages。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章