Bonjour à tous, aujourd'hui nous allons parler de la technologie XDP à travers quelques images.
De nombreux développeurs Linux ne connaissent peut-être pas la technologie XDP, en particulier ceux qui travaillent dans le développement lié aux réseaux. Si vous êtes un développeur Linux et ne connaissez pas la technologie XDP, vous risquez de manquer de nombreuses opportunités.
J'ai déjà appliqué la technologie XDP pour optimiser un projet et j'ai réussi à améliorer de 3 à 4 fois ses performances de traitement réseau. Certaines personnes peuvent penser que les performances initiales du projet sont médiocres et qu'il existe donc une marge d'amélioration considérable.
Je pense que dans le cadre de l'architecture logicielle actuelle, même avec une optimisation plus poussée, le goulot d'étranglement des performances ne sera pas facile à éliminer. Une architecture plus efficace doit être adoptée pour résoudre ce problème dans une perspective plus globale.
Mon projet de suivi, Magic Box, utilisera également la technologie XDP. Après avoir utilisé la technologie XDP, on estime que les performances réseau de la Magic Box seront améliorées d'environ 3 fois.
Avec l'émergence des technologies de réseau à très haut débit 10G, 40G et 100G, la pile de protocoles du noyau Linux est de plus en plus incapable de s'adapter au développement de nouvelles technologies réseau. La pile de protocoles du noyau Linux semble être devenue un goulot d'étranglement et un obstacle. gaspillage de performances du réseau. Afin de résoudre ce problème, le noyau Linux a introduit une nouvelle technologie, la technologie Kernel Bypass. L'idée principale de la technologie Kernel Bypass est que les paquets de données réseau ignorent la pile de protocoles du noyau et sont traités. directement par les programmes utilisateur. Cela peut éviter le coût de la pile de protocoles du noyau, améliorant ainsi considérablement les performances du réseau.
XDP est une technologie de contournement du noyau spécifique à Linux, à laquelle correspond la technologie DPDK. DPDK fonctionne bien en termes de performances, mais il n'est pas entièrement adapté aux systèmes Linux.
XDP est une technologie du noyau Linux qui permet un traitement et un transfert de paquets hautes performances dans l'espace du noyau en utilisant le mécanisme eBPF.
XDP peut améliorer considérablement les performances du réseau et fournir une interface de programmation flexible, permettant aux utilisateurs de mettre en œuvre diverses fonctions réseau personnalisées. Par rapport au traitement traditionnel des paquets dans l’espace utilisateur, XDP peut réduire efficacement le délai de traitement des paquets et l’utilisation du processeur.
Mode de fonctionnement de la technologie XDP :
Mode pilote en mode natif (hautes performances, nécessite la prise en charge de la carte réseau), exécute le programme XDP dans le pilote de la carte réseau et redirige les paquets de données réseau à partir du pilote de la carte réseau. Ce mode prend en charge davantage de cartes réseau et offre des performances élevées si le réseau. prend en charge la carte. Si c'est le cas, essayez d'utiliser ce mode.
Le mode de désinstallation (les plus performantes, les cartes réseau les moins prises en charge) désinstalle le programme XDP directement sur la carte réseau. Ce mode prend en charge peu de cartes réseau, nous n'en discuterons donc pas pour l'instant.
Le mode universel (bonnes performances, mieux pris en charge par le noyau Linux) apporte quelques améliorations.
Il y aura un sujet spécial sur la technologie XDP à l'avenir, nous n'en discuterons donc pas ici.
De nombreux étudiants confondent facilement les technologies XDP et AF_XDP.
AF_XDP doit être créé via la fonction socket.
socket(AF_XDP, SOCK_RAW, 0);
La technologie AF_XDP impliquera quelques points de connaissances importants :
Photos
La mémoire partagée UMEM est demandée via la fonction setsockopt.
setsockopt(umem->fd, SOL_XDP, XDP_UMEM_REG, &mr, sizeof(mr));
La mémoire partagée UMEM est généralement de 4K en tant qu'unité, chaque unité peut stocker un paquet de données, la mémoire partagée UMEM est généralement de 4096 unités.
Les paquets de données reçus et envoyés sont stockés dans l'unité de mémoire UMEM.
Les programmes utilisateur et le noyau peuvent exploiter directement cette zone de mémoire, donc lors de l'envoi et de la réception de paquets de données, il s'agit simplement d'une simple copie de mémoire et aucun appel système n'est requis.
用户程序需要维护一个UMEM内存使用记录,记录每一个UMEM单元是否已被使用,每个记录都会有一个相对地址,用于定位UMEM内存单元地址。
AF_XDP socket总共有4个无锁环形队列,分别为:
图片
环形队列创建方式:
//创建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个重要部分组成:
生产者序号用于指示数组当前可生产的元素位置,如果队列已满,将不能再生产。
消费者序号用于指示当前可消费的元素位置,如果队列已空,将不能再消费。
队列长度即数组长度。
mask=len-1,生产者和消费者序号不能直接使用,需要配合掩码使用,producer,consumer和mask进行与运算,可以获取到数组的索引值。
数组的每一个元素记录了UMEM单元的相对地址,如果UMEM单元有发送和接收的数据包,还会记录数据包的长度。
环形队列的无锁化通过原子变量来实现,原子变量和原子操作在高性能编程中经常会用到。
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继续接收数据。
图片
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单元进行回收。
图片
AF_XDP之所以高效,主要有三大原因:
内核旁路技术在处理网络数据包的时候,可以跳过Linux内核协议栈,相当于走了捷径,这样可以降低链路开销。
用户程序和内核共享UMEM内存和无锁环形队列,采用mmap技术将内存进行映射,用户操作UMEM内存不需要进行系统调用,减少了系统调用上下文切换成本。
无锁环形队列采用原子变量实现,可以减少线程切换和上下文切换成本。
基于以上几点,AF_XDP必然是一个高性能的网络技术,由于目前没有一个能够测试XDP极限性能的测试环境,大家如果对AF_XDP技术感兴趣,可以自行上网搜索相关资料。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!