IRQ 合并之前 NAPI 有哪些优点?

2023-12-29

众所周知,有两种方法可以避免高负载网络中硬件中断的一些开销,当硬件中断太多时,切换到它们会花费太多时间。这对于性能和程序风格的选择非常重要。

  1. NAPI(新API) http://en.wikipedia.org/wiki/New_API - 不使用硬件中断, and polls http://en.wikipedia.org/wiki/Polling_(computer_science)以太网设备每隔一段时间。 Linux内核默认使用中断驱动模式,只有当传入数据包的流量超过一定阈值时才切换到轮询模式。

http://en.wikipedia.org/wiki/New_API http://en.wikipedia.org/wiki/New_API内核可以定期地 查看用于传入网络数据包的到达没有存在 被打断,这消除了中断处理的开销。

  1. 中断合并 https://en.wikipedia.org/wiki/Interrupt_coalescing - 使用硬件中断,但如果发生中断,则禁用中断并启动poll http://en.wikipedia.org/wiki/Polling_(computer_science),持续一段时间,之后轮询终止并激活中断。

https://en.wikipedia.org/wiki/Interrupt_coalescing https://en.wikipedia.org/wiki/Interrupt_coalescing中的一项技术 哪些事件通常会触发硬件中断是 忍住, 任何一个直到达到一定数量工作待处理,或 超时定时器触发。

这两种方法都没有显着的中断成本——这是默认中断驱动模式之前的优势。

但第二种方法——中断合并更为理性,因为:

  • 更少的延迟- 一旦数据包到达,立即尝试在中断发生时处理它,或者如果最近发生过中断则轮询它。相反的NAPI不会立即处理该帧,而是会等待一定时间等待下一次轮询。

  • 更少的CPU使用率- 仅当至少有一个数据包已到达时才开始轮询。但即使没有收到帧,也不会徒劳地进行轮询,就像 NAPI 一样。

IRQ 合并之前 NAPI 有哪些优点?


我将 NAPI 视为中断合并的一种形式。我认为你的问题可能源于对NAPI的误解。首先,NAPI涉及到中断。而且,NAPI的民意调查其实也不是“白费”。请记住,对于 NAPI,其理念是高吞吐量流量是突发性的。 NAPI 仅在“数据包接收中断”发生后“启动”。

以下是如何使用 NAPI 的快速概述:

内核启动“数据包接收”中断,使用 NAPI 的网络设备驱动程序会检测到该中断。然后是网络设备驱动程序禁用与接收数据包相关的中断并使用 NAPI 告诉 Linux 网络子系统轮询设备驱动程序。 poll 函数由设备驱动程序实现,并传递给网络子系统,并包含设备驱动程序的数据包处理程序。在接收到足够的数据包或达到超时后,重新启用数据包接收中断,一切重新开始。

因此,NAPI 基本上只是 Linux 网络子系统中的一个集中式 API,用于支持中断合并以减少接收活锁情况。 NAPI 为设备驱动程序开发人员提供了一个干净的中断合并框架。 NAPI 并不是一直运行,而是仅在实际接收到流量时才发生,这使得它本质上是一种中断合并方案……至少在我的书中是这样。

Note:这都是在使用 NAPI 的网络设备驱动程序的上下文中,但实际上 NAPI 可以用于任何类型的中断。这也是 NAPI 的好处之一。

如果我的理解有什么错误,欢迎指出!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IRQ 合并之前 NAPI 有哪些优点? 的相关文章

  • 如何实现具有LinkedHashMap类似功能的ConcurrentHashMap?

    我用过LinkedHashMap with accessOrdertrue 并同时允许最多 500 个条目作为数据的 LRU 缓存 但由于可扩展性问题 我想转向一些线程安全的替代方案 ConcurrentHashMap在这方面似乎不错 但缺
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 查询列表项并使用 SharePoint Web 服务与对象模型

    我的公司正在考虑编写一个自定义应用程序 该应用程序需要跨多个网站集执行许多列表项查询 它需要运行 WSS 3 0 如果它也能在 WSS 2 0 上运行 那就太好了 它不会是为 MOSS SPS 设计的 但如果它能在这些平台上运行的话 那就太
  • 简单的带宽/延迟测试来评估用户体验

    我编写基于网络的应用程序 性能显然是一个关键因素 虽然数据库加载和页面渲染时间是我可以控制的 但用户的互联网连接却无法控制 我正在寻找的是一种指示用户拥有何种类型的连接的方法 类似于网站角落里的红绿灯 向用户显示他们与网站的连接类型 从而表
  • C# 按特定属性比较两个大型项目列表

    我有两个大的项目列表 其类如下所示 两个列表的类型相同 public class Items public string ItemID get set public int QuantitySold get set var oldList
  • Linux 汇编调试器

    我需要一个在 Linux 上进行汇编的调试器 我对 Linux 上缺乏调试器感到非常惊讶 它应该具有各种功能 例如显示寄存器等等 我会使用 GDB 但它对 NASM 不太友好 我宁愿让调试器具有英特尔语法 但我可以做出牺牲 我尝试过 kdb
  • 将 YAML 文件作为常量加载到 Rails 控制器中是否有效?

    我有几个大型数组需要可用于特定视图 目前 我将它们存储在 YAML 文件中并加载到控制器常量中 如下所示 我假设当 Rails 在环境设置期间加载文件时 这个常量存储在内存中 但我偏执地想知道每次访问该控制器时是否都在访问文件系统 谁能建议
  • 为什么运行一个空程序需要这么多指令?

    所以最近我了解到perfLinux 中的命令 我决定进行一些实验 因此我创建了一个空的 C 程序并测量了运行所需的指令数 echo int main gt emptyprogram c gcc O3 emptyprogram c o emp
  • 为什么 Ruby 中的 Dir.glob 看不到用方括号命名的文件夹中的文件?

    我有这棵树 folders foo fuu flac foo bar fuu flac foo bar fuu flac test rb 和这段代码 bin env ruby encoding utf 8 Dir glob folders
  • Rsync 制作平面副本

    我正在尝试编写一个脚本 将一个目录 带有子目录 的所有文件复制到另一个目录的根目录 所以想象一下我有这个文件结构 pic JPG PIC5 JPG FOLDER pic2 JPG pic3 JPG FOLDER2 pic4 JPG 我想要该
  • 将 React 应用程序作为后台进程运行

    我对部署前端代码完全陌生 因此提出了这个问题 我有一个 React 应用程序 需要作为后台进程运行 但是我对如何执行此操作有点困惑 我运行一个 npm 脚本 npm run build 在服务器上构建 缩小和服务项目 构建过程的相关代码是这
  • 如何在 Linux 上的 php 中启用 --enable-soap?

    这就是问题所在 我在 Apache 上安装了 PHP 5 2 9 但无法升级 PHP 有没有办法在 PHP 5 2 9 中启用 SOAP PHP 手册中说 要启用 SOAP 支持 请使用 enable soap 配置 PHP 这根本没有帮助
  • 有没有办法加快此 VBA 宏的运行速度,以在大范围内执行 1000 次 Vlookup?

    Sub Questionnaire to Ventilation Questionnaire to Ventilation Macro Keyboard Shortcut Ctrl Shift M Application ScreenUpd
  • 安装 gulp browserify 总是报错

    我尝试使用以下命令安装 gulp browserify npm install gulp browserify save dev 我已经成功安装了许多其他软件包 例如 gulp autoprefixer gulp concat gulp m
  • 对于 X 中的每个元素,找到最大的索引,而不会超出 Y 中的范围

    我正在寻找一种方法来提高以下算法的性能 给定两个数组 X 和 Y 对于 X 的每个元素 找到 Y 中不超过 X 中元素值的最大值的索引 可以安全地假设 X 和 Y 是单调递增 已排序 并且 Y 1 小于每个X 中的值 而且 X 通常比 Y
  • 使用可加载内核模块修改帧缓冲区(/dev/graphics/fb0)参数

    Problem 我必须配置 Android 平台使用的各种 LCD 显示器 几乎在所有情况下 都没有针对感兴趣的 LCD 显示器免费提供的电气规格 但通过经验和逆向工程 可以很好地猜测参数 我正在尝试使用可加载内核模块来微调显示参数 也欢迎
  • OpenMP 循环数组访问中的错误共享

    我想利用 OpenMP 来并行执行我的任务 我需要将数组的所有元素减去相同的数量并将结果写入另一个向量中 两个数组都是动态分配的malloc第一个填充了文件中的值 每个元素都有类型uint64 t pragma omp parallel f
  • 训练某些网络时,Keras(Tensorflow 后端)在 GPU 上比在 CPU 上慢

    我很难理解为什么 GPU 和 CPU 速度在小规模网络中相似 CPU 有时更快 而 GPU 在大规模网络中更快 问题底部的代码在 i7 6700k 上运行时间为 103 7 秒 但使用tensorflow gpu 时 代码运行时间为 29
  • (Linux) 如何在没有显示环境的情况下运行gtk程序? Gtk-警告 **:无法打开显示:

    我有一个必须在 GTK gui 环境中运行的程序 我只能使用ssh 该程序将在服务器 centos 6 上运行并安装 gnome X 显示 不需要看GUI 但运行完成后 我就能得到答案 VNC 和远程屏幕已禁用 当我在 ssh 中启动程序时

随机推荐