Heim  >  Artikel  >  Computer-Tutorials  >  Lassen Sie uns über den König der Linux-Netzwerkleistung sprechen – die XDP-Technologie

Lassen Sie uns über den König der Linux-Netzwerkleistung sprechen – die XDP-Technologie

WBOY
WBOYnach vorne
2024-03-08 14:00:221194Durchsuche

Lassen Sie uns über den König der Linux-Netzwerkleistung sprechen – die XDP-Technologie

Hallo zusammen, heute werden wir anhand einiger Bilder über die XDP-Technologie sprechen.

Viele Linux-Entwickler sind möglicherweise nicht mit der XDP-Technologie vertraut, insbesondere diejenigen, die in der netzwerkbezogenen Entwicklung arbeiten. Wenn Sie ein Linux-Entwickler sind und die XDP-Technologie nicht kennen, verpassen Sie möglicherweise viele Möglichkeiten.

Ich habe einmal die XDP-Technologie zur Optimierung eines Projekts eingesetzt und die Netzwerkverarbeitungsleistung erfolgreich um das Drei- bis Vierfache verbessert. Manche Leute denken vielleicht, dass die ursprüngliche Leistung des Projekts schlecht ist und es daher erheblichen Raum für Verbesserungen gibt.

Ich glaube, dass der Leistungsengpass unter der aktuellen Softwarearchitektur auch bei weiterer Optimierung nicht einfach zu beseitigen sein wird. Um dieses Problem zu lösen, müssen eine effizientere Architektur und eine umfassendere Perspektive übernommen werden.

Mein Nachfolgeprojekt Magic Box wird ebenfalls die XDP-Technologie verwenden. Nach dem Einsatz der XDP-Technologie wird die Netzwerkleistung der Magic Box schätzungsweise um das Dreifache verbessert.

1. Einführung in die XDP-Technologie

1.1 XDP-Technologie-Hintergrund

Mit dem Aufkommen der Netzwerktechnologie mit ultrahoher Bandbreite (10G-, 40G- und 100G-Netzwerke) ist der Linux-Kernel-Protokollstapel zunehmend nicht in der Lage, sich an die Entwicklung neuer Netzwerktechnologien anzupassen. Der Linux-Kernel-Protokollstapel scheint zu einem Engpass geworden zu sein Um dieses Problem zu lösen, hat der Linux-Kernel eine neue Technologie eingeführt: die Kernel-Bypass-Technologie. Die Kernidee der Kernel-Bypass-Technologie besteht darin, dass Netzwerkdatenpakete den Kernel-Protokollstapel überspringen und verarbeiten direkt durch Benutzerprogramme. Dadurch können die Kosten für den Kernel-Protokollstapel vermieden werden, wodurch die Netzwerkleistung erheblich verbessert wird.

XDP ist eine Linux-spezifische Kernel-Bypass-Technologie, die der DPDK-Technologie entspricht. DPDK schneidet leistungsmäßig gut ab, ist jedoch nicht vollständig für Linux-Systeme geeignet.

1.2 Was ist XDP?

XDP ist eine Linux-Kernel-Technologie, die mithilfe des eBPF-Mechanismus eine leistungsstarke Paketverarbeitung und -weiterleitung im Kernelraum erreicht.

XDP kann die Netzwerkleistung erheblich verbessern und eine flexible Programmierschnittstelle bereitstellen, die es Benutzern ermöglicht, verschiedene benutzerdefinierte Netzwerkfunktionen zu implementieren. Im Vergleich zur herkömmlichen Paketverarbeitung im User-Space kann XDP die Verzögerung bei der Paketverarbeitung und die CPU-Auslastung effektiv reduzieren.

XDP-Technologie-Arbeitsmodus:

Nativer Modus (hohe Leistung, erfordert Netzwerkkartenunterstützung), führt das XDP-Programm im Netzwerkkartentreiber aus und leitet Netzwerkdatenpakete vom Netzwerkkartentreiber um. Dieser Modus unterstützt mehr Netzwerkkarten und bietet eine hohe Leistung Karte unterstützt Wenn ja, versuchen Sie, diesen Modus zu verwenden.

Der Deinstallationsmodus (höchste Leistung, am wenigsten unterstützte Netzwerkkarten) deinstalliert das XDP-Programm direkt auf der Netzwerkkarte. Dieser Modus unterstützt nur wenige Netzwerkkarten, daher werden wir vorerst nicht darauf eingehen.

Der universelle Modus (gute Leistung, wird am besten vom Linux-Kernel unterstützt) bringt einige Verbesserungen.

Es wird in Zukunft ein spezielles Thema zur XDP-Technologie geben, daher werden wir hier nicht darauf eingehen.

2. AF_XDP Arbeitsprinzip

2.1 Gesamtarchitektur

Viele Studenten verwechseln leicht die XDP- und AF_XDP-Technologie.

  • XDP-Technologie ist eine neue Netzwerktechnologie, die auf der BPF-Technologie basiert.
  • AF_XDP ist ein Anwendungsszenario der XDP-Technologie. AF_XDP ist ein leistungsstarker Linux-Socket.

AF_XDP muss über die Socket-Funktion erstellt werden.

socket(AF_XDP, SOCK_RAW, 0);
Die

AF_XDP-Technologie wird einige wichtige Wissenspunkte beinhalten:

Bilder

  • AF_XDP erfordert die Zusammenarbeit des XDP-Programms, um das Senden und Empfangen von Netzwerkdatenpaketen abzuschließen.
  • Die Hauptaufgabe des XDP-Programms besteht darin, Datenpakete basierend auf den relevanten Informationen des Ethernet-Frames, wie MAC-Adresse, Fünffachinformationen usw., zu filtern und umzuleiten.
  • AF_XDP verarbeitet Ethernet-Datenrahmen, sodass das Benutzerprogramm Ethernet-Datenrahmen sendet und empfängt.
  • Benutzerprogramm AF_XDP, XDP betreibt einen gemeinsam genutzten Speicherbereich namens UMEM.
  • Der Empfang und die Übertragung von Netzwerkdatenpaketen erfordert die Verwendung von 4 sperrfreien Ringwarteschlangen.

2.2 Gemeinsamer UMEM-Speicher

UMEM Shared Memory wird über die Setsockopt-Funktion beantragt.

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

Der gemeinsam genutzte UMEM-Speicher beträgt normalerweise 4 KB als Einheit. Jede Einheit kann ein Datenpaket speichern. Der gemeinsam genutzte UMEM-Speicher beträgt normalerweise 4096 Einheiten.

Empfangene und gesendete Datenpakete werden in der UMEM-Speichereinheit gespeichert.

Sowohl Benutzerprogramme als auch der Kernel können diesen Speicherbereich direkt bedienen, sodass beim Senden und Empfangen von Datenpaketen nur eine einfache Speicherkopie erfolgt und keine Systemaufrufe erforderlich sind.

用户程序需要维护一个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技术感兴趣,可以自行上网搜索相关资料。

Das obige ist der detaillierte Inhalt vonLassen Sie uns über den König der Linux-Netzwerkleistung sprechen – die XDP-Technologie. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:mryunwei.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen