“零复制网络”与“内核绕过”?

2024-01-08

“零拷贝网络”和“内核绕过”有什么区别?这两个短语的意思是相同还是不同?内核绕过是“零复制网络”中使用的技术吗?这就是关系吗?


“零拷贝网络”和“内核绕过”有什么区别?这两个短语的意思是相同还是不同?内核绕过是“零复制网络”中使用的技术吗?这就是关系吗?

TL;DR - 它们是不同的概念,但内核旁路 API/框架内很可能支持零复制。


用户绕过

这种沟通方式也应该被考虑。也许有可能DMA 到 DMA完全不涉及CPU的事务。这个想法是使用splice()或类似的函数来避免用户空间根本不。请注意,与splice(),整个数据流不需要绕过用户空间。标头可以在用户空间中读取,数据可以直接流式传输到磁盘。最常见的缺点是splice()不进行校验和卸载。

零拷贝

The 零拷贝概念只是网络缓冲区固定在适当的位置并且不会移动。在许多情况下,这并不是真正有益的。最现代的网络硬件支持分散聚集 http://en.wikipedia.org/wiki/Vectored_I/O, 也叫作缓冲区描述符等等。这个想法是网络硬件理解物理指针。缓冲区描述符通常包括:

  1. 数据指针
  2. Length
  3. Next 缓冲区描述符

好处是网络标头不需要存在并排 and IP, TCP, and 应用标头可以在物理上与应用数据.

如果控制器不支持此功能,则TCP/IP标头必须位于用户数据以便可以在发送到之前填写它们网络控制器.

零拷贝还意味着一些内核用户 MMU 设置,以便共享页面。

内核绕过

当然,你可以绕过内核。这是什么pcap http://en.wikipedia.org/wiki/Pcap和其他嗅探软件已经做了一段时间了。然而,pcap并不会阻止正常的内核处理;但这个概念类似于内核旁路框架所允许的。即,直接将数据包传送到将发生处理标头的用户空间。

然而,很难看到这样的案例:用户空间除非与特定硬件绑定,否则将有明确的胜利。一些网络控制器可能有分散聚集控制器支持,其他控制器可能不支持。

有多种内核接口可以实现内核旁路。困难在于接收到的数据和生成用于传输的数据会发生什么情况。通常这涉及其他设备,因此有很多解决方案。


为了把这个放在一起...

这两个短语的意思是相同还是不同?

正如上面希望解释的那样,它们是不同的。

内核绕过是“零复制网络”中使用的技术吗?这就是关系吗?

事实恰恰相反。内核绕过可以使用零拷贝并且很可能会支持它,因为缓冲区完全在应用程序的控制之下。此外,内核和用户空间之间没有内存共享(意味着不需要 MMU 共享页面以及可能导致的任何缓存/TLB 影响)。所以如果你正在使用内核绕过,支持通常是有利的零拷贝;所以一开始事情可能看起来是一样的。

如果分散-聚集 DMA 可用(大多数现代控制器),用户空间或内核都可以使用它。零拷贝在这种情况下没有那么有用。

参考:

  • OnLoad 技术参考 http://www.solarflare.com/Content/UserFiles/Documents/Solarflare_OpenOnload_IntroPaper.pdf,一个高带宽内核旁路系统。
  • PF Ring http://www.ntop.org/products/pf_ring/自 2.6.32 起(如果已配置)
  • Linux内核网络缓冲区管理 http://vger.kernel.org/%7Edavem/skb_data.html大卫·米勒着。这给出了如何在内核中管理协议头/尾的想法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“零复制网络”与“内核绕过”? 的相关文章

  • 什么是监控网络活动的好工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我经营的是小区 现在我正在寻找一个在服务器 Windows 或 Linux 上运行的监控工具 它可以跟踪
  • 检测 Android 上的网络连接类型

    如何检测 Android 上的网络连接类型 是否通过ConnectivityManager getActiveNetworkInfo getType 答案是否仅限于 Wifi 和移动设备 如果问题是要确定手机的网络是否已连接且速度是否足以满
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • (nasm x86实模式)如何在引导加载的扇区中写入/读取字符串?

    我正在使用 NASM 为 x86 实模式编写一个最小操作系统 用于教育目的 我想使用 512 字节引导扇区加载包含操作系统其余部分的更大扇区 我已经成功创建了一个加载另一个扇区的引导扇区 但我似乎无法在加载的扇区中写入 读取字符串 这是我的
  • Docker忽略limits.conf(试图解决“打开文件太多”错误)

    我正在运行一个 Web 服务器 该服务器正在处理数千个并发 Web 套接字连接 为了实现这一点 在 Debian linux 我的基本镜像是 google debian wheezy 在 GCE 上运行 上 打开文件的默认数量设置为 100
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • 正则表达式删除块注释也删除 * 选择器

    我正在尝试使用 bash 从 css 文件中删除所有块注释 我有以下 sed 命令的正则表达式 sed r s w s w d 这可以很好地去除块注释 例如 This is a comment this is another comment
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • 来自守护程序的错误响应:加入会话密钥环:创建会话密钥:超出磁盘配额

    我尝试在我的服务器上安装 docker 使用本教程 https docs docker com install linux docker ce ubuntu 我想远程运行 docker 镜像并使用 portainer Web 界面来管理一切
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • 批量删除文件名中包含 BASH 中特殊字符的子字符串

    我的目录中有一个文件列表 opencv calib3d so2410 so opencv contrib so2410 so opencv core so2410 so opencv features2d so2410 so opencv
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 如何使用来自 Microsoft-Windows-NDIS-PacketCapture 提供程序的实时 ETW 事件?

    更大的问题是一般如何使用实时 ETW 网络堆栈事件 但我特别感兴趣Microsoft Windows NDIS PacketCapture 提供程序 所有其他网络堆栈提供程序都部分工作 但 NDIS PacketCapture NDIS P
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我

随机推荐

  • 如何重新校准 Qt 应用程序的触摸事件?

    我有一个简单的 Qt5 2 应用程序 它是为 TI AM335x EVM 基于 ARM 的处理器 构建的 它只有 1 个按钮 可启用板上的一些 LED 我遇到的问题是触摸事件未针对屏幕进行校准 例子 X 所以如果 是按钮所在的位置 X是您必
  • 每当按下光标或箭头键时,如何获取当前光标位置(在文本区域中)?

    我试图单击一下后立即获取文本光标的位置down鼠标重新定位它 问题是selectionStart and selectionEnd不返回光标的最新位置 因为在单击之前不会存储 新 位置released 当您尝试使用鼠标重新定位插入符号时 代
  • 如何使用 Gradle Kotlin 脚本创建 fat JAR?

    如题 我想知道如何修改gradle build kts为了有一个任务来创建一个独特的jar包含所有依赖项 包括 kotlin lib 我在 Groovy 中找到了这个示例 create a single Jar with all depen
  • mingw-4.8.1 原子问题

    当我尝试使用原子的 is lock free 方法时 出现以下编译错误 struct Simple1 int i struct Simple2 int a int b struct Simple3 int a int b int c int
  • Prestashop:../../../classes/Configuration.php 中内存不足(已分配...)

    Prestashop 突然给出了一个http 500 错误 我打开错误日志并得到以下信息 致命错误 内存不足 已分配 709623808 尝试分配 130968 字节 中 var www vhosts 44 252639 webspace
  • ActiveRecord::NoEnvironmentInSchemaError

    我正在尝试在新升级的应用程序 Rails 5 上执行与数据库相关的操作 但无法在本地执行破坏性数据库命令 rails db reset or rails db drop 跟踪结果如下数据 rails db drop trace Invoke
  • ruby-debug 安装错误:无法构建 gem 本机扩展

    我正在使用 Rails 3 运行 1 9 2 我正在使用rvm I did sudo gem install ruby gem and got Building native extensions This could take a whi
  • 如何根据滚动百分比移动 div

    我正在尝试为我的应用程序制作一些动画 但我无法弄清楚 我希望文本和描述根据页面滚动的程度而移动 对于第一个 div 我成功做到了 但对于其他 div 什么也没有发生 当我滚动超过 40 来根据滚动移动 div 时 我该怎么做 这是我的代码
  • Freebase 查询 - 排除某些值

    我想检索所有电影的名称及其类型 如果有关流派的信息为空也没关系 但如果流派已知 我想检索它 film film genre id null optional optional 但我对同性恋色情不感兴趣 所以我想排除所有类型为 en gay
  • startManagingCursor(cursor) 已弃用的方法

    我使用了这段代码 Cursor c cr query message null null null null startManagingCursor c But startManagingCursor c 是一个已弃用的方法 我怎样才能更换
  • C++ 枚举的基础类型是什么?

    这可能已经在其他地方得到了回答 但我找不到合适的答案 我有这个代码 enum enumWizardPage WP NONE 0x00 WP CMDID 0x01 WP LEAGUES 0x02 WP TEAMS 0x04 WP COMP 0
  • Delphi 服务应用程序随机崩溃

    我有一个德尔福服务应用程序 Indy TCP 服务器和许多客户端 最多 50 个 到 Firebird 的 ADO 连接和简单的网络交换 应用程序在下一个事件 例如 中随机崩溃 可能在 7 天后工作 可能是 1 小时 文件 rollcont
  • CSS 重叠箭头

    我正在尝试仅使用 CSS3 来完成与下图非常非常相似的事情 唯一的区别是最后一个 div 有一个尖头 在我寻找类似适应的东西时 我遇到了这个 js 小提琴 http jsfiddle net amkrtchyan eju9r 14 这非常接
  • GuestAdditions 版本不匹配

    当我使用这个命令时 vagrant up 我收到此错误 machine1 GuestAdditions versions on your host 4 3 36 and guest 5 0 10 do not match 如何从 ubunt
  • Kotlin 中线程和协程的区别

    Kotlin 中是否存在与其他语言的协程实现不同的特定语言实现 协程就像轻量级线程是什么意思 有什么不同 Kotlin 协程实际上是并行 并发 运行的吗 即使在多核系统中 在任何给定时间都只有一个协程在运行吗 这里我启动了 100 000
  • 如何通过南迁在现有模型中添加一对一的关系字段

    我已经有模型了 class ModelA models Model name models CharField max length 255 blank False 我里面有很多条目 现在我想在其中添加一个字段 即 user models
  • 修改R包数据

    bio infer 包包含需要修改的数据框 usr lib R library bio infer data itis ttable rda 加载 bio infer 包并附加数据框后 data 函数 我使用 write table 将数据
  • swift 3 准备(for segue: )功能损坏? [复制]

    这个问题在这里已经有答案了 由于某些奇怪的原因 对于 swift 3 prepare for segue 方法拒绝确认 segue 标识符 我将以下 IBAction 连接到 UI 上的几个按钮 IBAction func goToImag
  • 如何在 Spring Boot 中创建单个可执行战争

    我们正在使用 Spring Boot 开发 Spring Cloud 项目 我们的目标是创建一个可以使用 java jar 运行的可执行 war 我关注了 SO 上的几篇文章 并能够通过 1 在 2 在 spring boot maven
  • “零复制网络”与“内核绕过”?

    零拷贝网络 和 内核绕过 有什么区别 这两个短语的意思是相同还是不同 内核绕过是 零复制网络 中使用的技术吗 这就是关系吗 零拷贝网络 和 内核绕过 有什么区别 这两个短语的意思是相同还是不同 内核绕过是 零复制网络 中使用的技术吗 这就是