成人免费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

虛擬機保護技術

2021-01-28 22:31:33

分組密碼算法

2023-09-22 17:36:37

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虛擬機

2020-10-15 06:56:51

MySQL排序

2022-11-01 08:46:20

責任鏈模式對象

2021-02-06 08:34:49

函數memoize文檔
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区免费 | 国产精品99久久久久久宅男 | 超级黄色一级片 | 国产亚洲精品久久19p | 春色av| 在线伊人网| h视频在线免费看 | 精品福利在线 | 天天干天天爽 | 亚洲毛片在线 | 一区二区三区四区国产 | 天堂一区在线 | 午夜专区 | 久久日本 | 国产一区二区三区在线看 | 精品欧美一区二区三区久久久 | 亚洲国产成人精品女人久久久野战 | 一区二区视频在线 | 在线亚洲人成电影网站色www | 国产日韩一区二区 | 久久一日本道色综合久久 | 欧洲精品在线观看 | 亚洲免费视频在线观看 | 久久久www成人免费无遮挡大片 | 综合二区| 欧美一二三 | 精品在线看| 国产精品一区二区av | 黄色一级片aaa | 午夜视频在线播放 | 欧美精品电影一区 | 国产成人影院 | 高清视频一区二区三区 | 日日噜噜噜夜夜爽爽狠狠视频, | 福利片一区二区 | 亚洲三区在线观看 | 午夜一区二区三区在线观看 | 午夜天堂精品久久久久 | 久久久久久久久一区 | 一区二区视频免费观看 | 日韩午夜场|