Linux内核网络性能优化
共 3460字,需浏览 7分钟
·
2021-04-28 02:53
Linux内核网络性能优化
本篇文章转自Linux内核之旅
作者: 梁金荣
原文: http://kerneltravel.net/blog/2021/ljr_network17/
前言
Linux网络协议栈
sk_buff
结构体来传递。网络套接字是用 sock
结构体来定义的,该结构体在各网络协议结构体的开头部分存放,例如 tcp_sock
。网络协议使用 proto
结构体挂载到网络套接字结构体上,例如 tcp_prot
、udp_prot
等,该结构体中定义了一系列该网络协议需要的回调函数,包括 connect
、sendmsg
、recvmsg
等。以接收数据包为例,可以概括为:
•加载网卡驱动,初始化•数据包从外部网络进入网卡•网卡(通过DMA)将包拷贝到内核内存中的 ring buffer
•产生硬件中断,通知系统收到了一个包•驱动调用 NAPI ,如果轮询(poll
)还没有开始,就开始轮询•ksoftirqd
软中断调用 NAPI 的 poll
函数从 ring buffer
收包(poll
函数是网卡驱动在初始化阶段注册的;每个cpu上都运行着一个 ksoftirqd
进程,在系统启动期间就注册了)•ring buffer
里面对应的内存区域解除映射(unmapped
)•如果 packet steering 功能打开,或者网卡有多队列,网卡收到的数据包会被分发到多个cpu•数据包从队列进入协议层•协议层处理数据包•数据包从协议层进入相应 socket
的接收队列•应用程序从 socket
拿到数据包
DPDK
XDP
eXpress Data Path
)为Linux内核提供了高性能、可编程的网络数据路径。XDP使用网卡驱动程序中内置的BPF钩子直接访问原始网络帧数据,直接告诉网卡应该传递还是丢弃数据包,避免了TCP/IP协议栈处理的额外消耗。因为网络包在未进入网络协议栈之前就处理,所以它给Linux网络带来了巨大的性能提升(性能比DPDK还要高)。XDP主要的特性
•在网络协议栈前处理•无锁设计•批量I/O操作•轮询式•直接队列访问•不需要分配skbuff•支持网络卸载•DDIO•XDP程序快速执行并结束,没有循环•Packeting steering
XDP与DPDK的对比
优点:
•无需第三方代码库和许可•同时支持轮询式和中断式网络•无需分配大页•无需专用的CPU•无需定义新的安全网络模型•可以回退到正常网络栈处理过程
缺点:
•XDP不提供缓存队列(qdisc),TX设备太慢时直接丢包•XDP程序是专用的,不具备网络协议栈的通用性
应用场景
•快速DDoS缓解•软件定义路由(SDR)
CPU负载均衡
NAPI
RSS(receive side scaling):网卡多队列
•网卡对接收到的报文进行解析,获取IP地址、协议和端口五元组信息;•网卡通过配置的HASH函数根据五元组信息计算出HASH值,也可以根据二、三或四元组进行计算;•取HASH值的低几位(不同网卡可能不同)作为RETA(redirection table)的索引;•根据RETA中存储的值分发到对应的CPU。RSS需要硬件支持。基于RSS技术程序可以通过硬件在多个CPU之间来分发数据流,并且可以通过对RETA的修改来实现动态的负载均衡。
RPS(receive packet Steering):RSS的软件实现
RPS是接收报文的时候处理,而XPS是发送报文的时候处理器优化。
XPS(transmit packet Steering):应用在发送方向
RFS(receive flwo Steering): 基于flow的RPS
总结
参考链接:
•https://www.cnblogs.com/sammyliu/p/5225623.html•https://blog.selectel.com/introduction-dpdk-architecture-principles/•https://medium.com/@jain.sm/express-data-path-xdp-introduction-d41b77ffbabf•https://tonydeng.github.io/sdn-handbook/linux/XDP/•http://cxd2014.github.io/2017/10/15/linux-napi/•https://chengqian90.com/%E6%9D%82%E8%B0%88/%E7%BD%91%E7%BB%9CRPS-RFS-GSO-GRO%E7%AD%89%E5%8A%9F%E8%83%BD%E9%87%8A%E4%B9%89.html
欢迎关注我的公众号“须弥零一”,原创技术文章第一时间推送。