NAPI(New API)

文章讲述了现代网卡如何使用DMA直接将数据写入内存,以及操作系统如何通过预留内存配合网卡工作。当数据包速率过高可能导致丢包时,RSS或多队列技术能利用多CPU并行处理。NAPI机制则用于减少硬件中断,提高效率,通过注册poll方法来批量处理数据包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天的大部分网卡都使用 DMA 将数据直接写到内存,接下来操作系统可以直接从里 面读取。要实现这一功能,设备驱动必须和操作系统合作,预留(reserve)出一段内存来给网卡 使用。预留成功后,网卡知道了这块内存的地址,接下来收到的包就会放到这里,进而被 操作系统取走。

由于这块内存区域是有限的,如果数据包的速率非常快,单个 CPU 来不及取走这些包,新 来的包就会被丢弃。这时候,Receive Side Scaling(RSS,接收端扩展)或者多队列( multiqueue)一类的技术可能就会排上用场。

一些网卡有能力将接收到的包写到多个不同的内存区域,每个区域都是独立的接收队列。这 样操作系统就可以利用多个 CPU(硬件层面)并行处理收到的包。只有部分网卡支持这个功 能。

RX 队列的数量和大小可以通过 ethtool 进行配置,调整这两个参数会对收包或者丢包产生可见影响。

网卡通过对 packet 头(例如源地址、目的地址、端口等)做哈希来决定将 packet 放到 哪个 RX 队列。只有很少的网卡支持调整哈希算法。如果支持的话,那你可以根据算法将特定 的 flow 发到特定的队列,甚至可以做到在硬件层面直接将某些包丢弃。

一些网卡支持调整 RX 队列的权重,你可以有意地将更多的流量发到指定的 queue。

当一个数据帧通过 DMA 写到 RAM(内存)后,网卡会产生一个硬件中断(IRQ),通知数据包到了。

如果有大量的数据包到达,就会产生大量的硬件中断。CPU 忙于处 理硬件中断的时候,可用于处理其他任务的时间就会减少。

NAPI(New API)是一种新的机制,可以减少产生的硬件中断的数量。一般直到网卡被启用之后,NAPI 才被启用。

启用 NAPI 很简单,调用 napi_enable 函数就行,这个函数会设置 NAPI 变量(struct napi_struct)中一个表示是否启用的标志位。前面说到,NAPI 启用后并不是立即开始工 作(而是等硬中断触发)。

NAPI 接收数据包的方式和传统方式不同,它允许设备驱动注册一个 poll 方法,然后调 用这个方法完成收包。

NAPI 的使用方式:

  1. 驱动打开 NAPI 功能,默认处于未工作状态(没有在收包)

  1. 数据包到达,网卡通过 DMA 写到内存

  1. 网卡触发一个硬中断,中断处理函数开始执行;MSI-X 中断是比较推荐的方式,尤其是对于支持多队列的网卡。因为每个 RX 队列有独 立的 MSI-X 中断,因此可以被不同的 CPU 处理(通过 irqbalance 方式,或者修改 /proc/irq/IRQ_NUMBER/smp_affinity)。

  1. 软中断(softirq),唤醒 NAPI 子系统。这会触发在一个单独的线程里,调用驱动注册的 poll 方法收包

  1. 驱动禁止网卡产生新的硬件中断。这样做是为了 NAPI 能够在收包的时候不会被新的中 断打扰

  1. 一旦没有包需要收了,NAPI 关闭,网卡的硬中断重新开启

  1. 转步骤 2

和传统方式相比,NAPI 一次中断会接收多个包,因此可以减少硬件中断的数量。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值