Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — NAPI

举报
云物互联 发表于 2021/08/06 22:22:55 2021/08/06
【摘要】 目录 文章目录 目录NAPI中断方式与轮询方式 NAPI 值得注意的是,传统收包方式是每个报文都会触发中断,如果中断太频繁,CPU 就总是处理中断,其他任务无法得到调度,于是 NAPI(New API)收包方式出现了,其思路是采用 “中断 + 轮询” 的方式收包以提高吞吐。 NAPI 收包需要网卡驱动支持,例如:Intel e1000 系列网卡。 ...

目录

NAPI

值得注意的是,传统收包方式是每个报文都会触发中断,如果中断太频繁,CPU 就总是处理中断,其他任务无法得到调度,于是 NAPI(New API)收包方式出现了,其思路是采用 “中断 + 轮询” 的方式收包以提高吞吐。

NAPI 收包需要网卡驱动支持,例如:Intel e1000 系列网卡。

下图为传统方式和 NAPI 方式收包流程差异:

在这里插入图片描述

在这里插入图片描述

中断方式与轮询方式

Linux 内核在接收数据时有两种方式可供选择,一种是中断方式,另外一种是轮询方式。

从本质上来讲,中断,是一种电信号,当设备有某种事件发生的时候,它就会产生中断,通过总线把电信号发送给中断控制器,如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到内存中内核设置的中断处理程序的入口点,进行中断处理。

  • 使用中断方式,首先在使用该驱动之前,需要将该中断对应的中断类型号和中断处理程序注册进去。网卡驱动在初始化时会将具体的 xx_open 函数挂接在驱动的 open 接口上。网卡的中断一般会分为两种,一种是发送中断,另一种是接收中断。Linux 内核需要分别对这两种中断类型号进行注册。对于中断方式来说,由于每收到一个包都会产生一个中断,而处理器会迅速跳到中断服务程序中去处理收包,因此中断接收方式的实时性高,但如果遇到数据包流量很大的情况时,过多的中断会增加系统的负荷。

    • 发送中断处理程序(xx_isr_tx)的工作主要是监控数据发送状态、更新数据发送统计等。
    • 接收中断处理程序(xx_isr_rx)的工作主要是接收数据并传递给协议层、监控数据接收状态、更新数据接收统计等。
  • 如果采用轮询方式,就不需要使能网卡的中断状态,也不需要注册中断处理程序。操作系统会专门开启一个任务去定时检查 BD 表,如果发现当前指针指向的 BD 非空闲,则将该 BD 对应的数据取出来,并恢复 BD 的空闲状态。由于是采用任务定时检查的原理,从而轮询接收方式的实时性较差,但它没有中断那种系统上下文切换的开销,因此轮询方式在处理大流量数据包时会显得更加高效。

文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。

原文链接:is-cloud.blog.csdn.net/article/details/103025477

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。