成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊一聊Linux網絡性能王者——XDP技術

系統 Linux
XDP技術對于很多Linux開發人員來說是一個很陌生的技術,如果你是一個Linux開發人員,恰好你從事的網絡相關的開發工作,如果你不懂XDP技術,這是一個非常大的損失。

大家好,今天我們通過幾張圖來聊一聊XDP技術。

XDP技術對于很多Linux開發人員來說是一個很陌生的技術,如果你是一個Linux開發人員,恰好你從事的網絡相關的開發工作,如果你不懂XDP技術,這是一個非常大的損失。

這個是我一個真實的經歷,曾經我采用XDP技術優化過一個項目,讓一個項目的網絡處理性能提高了3-4倍,可能很多小伙伴會懷疑項目原本性能就很差,所以才會有很大的提升空間。

我想說的是,按照原來的軟件架構,不管你怎么優化,性能的瓶頸是不可能突破的,唯一的方式是采用更高效的架構,從更高維度去解決問題。

后續我的項目魔法盒子也會用上XDP技術,采用XDP技術后,魔法盒子的網絡性能估計能夠提高3倍左右。

1.XDP技術簡介

1.1 XDP技術背景

隨著超高帶寬網絡技術10G,40G,100G網絡的出現,Linux內核協議棧越來越不能適應新的網絡技術的發展,Linux內核協議棧似乎成為了網絡性能的瓶頸和雞肋,為了解決這個尷尬的處境,Linux內核引入了一個新的技術內核旁路(Kernel Bypass)技術,內核旁路技術的核心思想是網絡數據包跳過內核協議棧,直接由用戶程序處理,這樣可以避免內核協議棧的開銷,大大提高網絡性能。

XDP就是屬于Linux自己的內核旁路技術,與之對應的還有一種內核旁路技術DPDK技術,DPDK擁有非常不錯的性能,但是DPDK技術并不非常適用于Linux系統。

1.2 XDP是什么?

XDP是一種Linux內核技術,通過使用eBPF機制,在內核空間中實現高性能的數據包處理和轉發。

它可以顯著提高網絡性能,并提供了靈活的編程接口,使用戶能夠實現各種自定義的網絡功能,與傳統的用戶空間數據包處理相比,XDP可以顯著降低數據包處理的延遲和CPU占用。

XDP技術工作模式:

 原生模式(性能高,需要網卡支持)驅動模式,將XDP程序運行在網卡驅動中,從網卡驅動中將網絡數據包重定向,該模式支持的網卡較多且性能也很高,如果網卡支持的話,盡量使用該模式。

卸載模式(性能最高,支持的網卡最少)將XDP程序直接卸載到網卡,該模式支持的網卡少,暫不做討論。

通用模式(性能良好,Linux內核支持最好)XDP程序運行在Linux內核協議棧入口,無需驅動支持,性能低于XDP其他的兩種模式,但是即使XDP通用模式,也會給你的系統性能帶來一定的提升。

后續會有專門的專題來講XDP技術,這里不展開討論。

2.AF_XDP工作原理

2.1 整體架構

很多同學容易將XDP和AF_XDP技術給弄混淆。

  • XDP技術是基于BPF技術的一種新的網絡技術。
  • AF_XDP是XDP技術的一種應用場景,AF_XDP是一種高性能Linux socket。

AF_XDP需要通過socket函數創建。

socket(AF_XDP, SOCK_RAW, 0);

AF_XDP技術會涉及到一些比較重要的知識點:

圖片圖片

  • AF_XDP想要XDP程序配合,才能完成網絡數據包收發。
  • XDP程序主要工作是根據以太網幀的相關信息如:MAC地址,五元組信息等,進行數據包的過濾和重定向。
  • AF_XDP處理的是以太網數據幀,所以用戶程序發送和接收的是以太網數據幀。
  • 用戶程序,AF_XDP,XDP會操作一個共享的內存區域,稱之為UMEM。
  • 網絡數據包的接收和發送需要用到4個無鎖環形隊列。

2.2 UMEM共享內存

UMEM共享內存通過setsockopt函數進行申請。

setsockopt(umem->fd, SOL_XDP, XDP_UMEM_REG, &mr, sizeof(mr));

UMEM共享內存通常以4K為一個單元,每個單元可以存儲一個數據包,UMEM共享內存通常為4096個單元。

接收和發送的數據包都是存儲在UMEM內存單元。

用戶程序和內核都可以直接操作這塊內存區域,所以發送和接收數據包時,只是簡單的內存拷貝,不需要進行系統調用。

用戶程序需要維護一個UMEM內存使用記錄,記錄每一個UMEM單元是否已被使用,每個記錄都會有一個相對地址,用于定位UMEM內存單元地址。

2.2 無鎖環形隊列

AF_XDP socket總共有4個無鎖環形隊列,分別為:

  • 填充隊列(FILL RING)
  • 已完成隊列(COMPLETION RING)
  • 發送隊列(TX RING)
  • 接收隊列(RX RING)

圖片圖片

環形隊列創建方式:

//創建FILL RINGsetsockopt(fd, SOL_XDP, XDP_UMEM_FILL_RING,&umem->config.fill_size,               sizeof(umem->config.fill_size));             //創建COMPLETION RINGsetsockopt(fd, SOL_XDP, XDP_UMEM_COMPLETION_RING,&umem->config.comp_size,               sizeof(umem->config.comp_size));//創建RX RING     setsockopt(xsk->fd, SOL_XDP, XDP_RX_RING,&xsk->config.rx_size,                   sizeof(xsk->config.rx_size));//創建TX RING                setsockopt(xsk->fd, SOL_XDP, XDP_TX_RING, &xsk->config.tx_size,                   sizeof(xsk->config.tx_size));

4個環形隊列實現方式基本相同,環形隊列是對數組進行封裝的數據結構,環形隊列由5個重要部分組成:

  • 生產者序號(producer)

    生產者序號用于指示數組當前可生產的元素位置,如果隊列已滿,將不能再生產。

  • 消費者序號(consumer)

    消費者序號用于指示當前可消費的元素位置,如果隊列已空,將不能再消費。

  • 隊列長度(len)

    隊列長度即數組長度。

  • 隊列掩碼(mask)

    mask=len-1,生產者和消費者序號不能直接使用,需要配合掩碼使用,producer,consumer和mask進行與運算,可以獲取到數組的索引值。

  • 固定長度數組

數組的每一個元素記錄了UMEM單元的相對地址,如果UMEM單元有發送和接收的數據包,還會記錄數據包的長度。

環形隊列的無鎖化通過原子變量來實現,原子變量和原子操作在高性能編程中經常會用到。

2.3 AF_XDP接收數據包

 AF_XDP接收數據包需要FILL RING,RX RING兩個環形隊列配合工作。

第一步:XDP程序獲取可用UMEM單元。

FILL RING記錄了可以用來接收數據包的UMEM單元數量,用戶程序根據UMEM使用記錄,定期的往FILL RING生產可用UMEM單元。

 第二步:XDP填充新的接收數據包

XDP程序消費FILL RING中UMEM單元用于存放網絡數據包,接收完數據包后,將UMEM單元和數據包長度重新打包,填充至RX RING隊列,生產一個待接收的數據包。

 第三步:用戶程序接收網絡數據包

用戶程序檢測到RX RING有待接的收數據包,消費RX RING中數據包,將數據包信息從UMEM單元中拷貝至用戶程序緩沖區,同時用戶程序需要再次填充FILL RING隊列推動XDP繼續接收數據。

圖片圖片

2.4 AF_XDP發送數據包

AF_XDP發送數據包需要COMP RING,TX RING兩個環形隊列配合工作。

第一步:用戶程序確保有足夠的UMEM發送單元

COMP RING記錄了已完成發送的數據包(UMEM單元)數量,用戶程序需要回收這部分UMEM單元,確保有足夠的UMEM發送單元。

第二步:用戶程序發送數據包

用戶程序申請一個可用的UMEM單元,將數據包拷貝至該UMEM單元,然后生產一個待發送數據包填充值TX RING。

第三步:XDP發送數據包

XDP程序檢測到TX RING中有待發送數據包,從TX RING消費一個數據包進行發送,發送完成后,將UMEM單元填充至COMP RING,生產一個已完成發送數據包,用戶程序將對該數據包UMEM單元進行回收。

圖片圖片

3. AF_XDP高效的秘密

AF_XDP之所以高效,主要有三大原因:

  • 內核旁路技術

內核旁路技術在處理網絡數據包的時候,可以跳過Linux內核協議棧,相當于走了捷徑,這樣可以降低鏈路開銷。

  • 內存映射

用戶程序和內核共享UMEM內存和無鎖環形隊列,采用mmap技術將內存進行映射,用戶操作UMEM內存不需要進行系統調用,減少了系統調用上下文切換成本。

  • 無鎖環形隊列

無鎖環形隊列采用原子變量實現,可以減少線程切換和上下文切換成本。

基于以上幾點,AF_XDP必然是一個高性能的網絡技術,由于目前沒有一個能夠測試XDP極限性能的測試環境,大家如果對AF_XDP技術感興趣,可以自行上網搜索相關資料。

責任編輯:武曉燕 來源: 物聯網心球
相關推薦

2019-03-20 14:29:46

Linux虛擬內存

2018-11-29 09:13:47

CPU中斷控制器

2020-08-24 07:12:17

前端CRP性能優化

2019-02-13 14:15:59

Linux版本Fedora

2020-06-28 09:30:37

Linux內存操作系統

2022-02-09 16:23:07

網絡安全零信任技術

2021-01-04 08:09:07

Linux內核Watchdog

2021-04-28 08:35:52

區塊鏈技術開發

2020-11-06 07:10:21

5G定位

2019-09-19 16:59:04

數據結構設計數據庫

2018-04-04 14:43:27

虛擬機保護技術

2023-09-22 17:36:37

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2018-06-07 13:17:12

契約測試單元測試API測試

2023-10-31 18:52:29

網絡框架XDP技術

2022-09-26 08:03:25

VMware虛擬機

2021-08-04 09:32:05

Typescript 技巧Partial

2021-01-29 08:32:21

數據結構數組

2021-02-06 08:34:49

函數memoize文檔
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品在线视频 | www.操com | 成人国产午夜在线观看 | 天天爽夜夜骑 | 精品久久99 | 国产成人精品一区二区在线 | 日韩有码在线观看 | 亚洲视频在线播放 | 欧美性视频在线播放 | 亚洲精品3 | 一区二区视频在线 | 中午字幕在线观看 | 国产成人精品a视频一区www | 久草网址 | 久久久一二三区 | 午夜视频一区二区三区 | 91精品一区二区三区久久久久久 | 国产成人一区二区三区 | 午夜三级在线观看 | 成人超碰| 麻豆精品久久久 | 中文字幕 国产精品 | 一区二区视频在线 | 黄网站涩免费蜜桃网站 | 韩日一区 | 亚洲精品一二三 | 亚洲欧美视频 | 国产中文一区二区三区 | 日韩国产欧美一区 | caoporn地址| 日本成人中文字幕在线观看 | 中文字幕动漫成人 | 亚洲网址 | 国产精品国产精品国产专区不片 | 天天躁人人躁人人躁狂躁 | 四虎影院免费在线播放 | 欧美一级特黄aaa大片在线观看 | 精品免费国产视频 | 久久精品亚洲 | 精品久| 国产精品久久久久久久久婷婷 |