目錄
2.2 UMEM共享内存" >2.2 UMEM共享内存
2.2 无锁环形队列" >2.2 无锁环形队列
首頁 電腦教學 電腦知識 聊一聊Linux網路效能王者-XDP技術

聊一聊Linux網路效能王者-XDP技術

Mar 08, 2024 pm 02:00 PM
linux 網路卡驅動 xdp 基數

聊一聊Linux網路效能王者-XDP技術

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

许多Linux开发人员可能对XDP技术感到陌生,尤其是那些从事网络相关开发工作的人。如果你是一名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在性能方面表现出色,然而并不完全适用于Linux系统。

1.2 XDP是什么?

XDP是一种Linux内核技术,通过使用eBPF机制,在内核空间中实现高性能的数据包处理和转发。

XDP可以显著提升网络性能,并提供灵活的编程接口,让用户能够实现各种自定义的网络功能。相较于传统的用户空间数据包处理,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 RINGsetsockopt(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技术感兴趣,可以自行上网搜索相关资料。

以上是聊一聊Linux網路效能王者-XDP技術的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1670
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

vscode上一步下一步快捷鍵 vscode上一步下一步快捷鍵 Apr 15, 2025 pm 10:51 PM

VS Code 一步/下一步快捷鍵的使用方法:一步(向後):Windows/Linux:Ctrl ←;macOS:Cmd ←下一步(向前):Windows/Linux:Ctrl →;macOS:Cmd →

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

notepad怎麼運行java代碼 notepad怎麼運行java代碼 Apr 16, 2025 pm 07:39 PM

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

sublime寫好代碼後如何運行 sublime寫好代碼後如何運行 Apr 16, 2025 am 08:51 AM

在 Sublime 中運行代碼的方法有六種:通過熱鍵、菜單、構建系統、命令行、設置默認構建系統和自定義構建命令,並可通過右鍵單擊項目/文件運行單個文件/項目,構建系統可用性取決於 Sublime Text 的安裝情況。

Linux的主要目的是什麼? Linux的主要目的是什麼? Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

laravel安裝代碼 laravel安裝代碼 Apr 18, 2025 pm 12:30 PM

要安裝 Laravel,需依序進行以下步驟:安裝 Composer(適用於 macOS/Linux 和 Windows)安裝 Laravel 安裝器創建新項目啟動服務訪問應用程序(網址:http://127.0.0.1:8000)設置數據庫連接(如果需要)

git軟件安裝 git軟件安裝 Apr 17, 2025 am 11:57 AM

安裝 Git 軟件包括以下步驟:下載安裝包運行安裝包驗證安裝配置 Git安裝 Git Bash(僅限 Windows)

See all articles