NAPI(New API)

今天的大部分网卡都使用 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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值