网络框架netpoll中的SO_ZEROCOPY

背景了解

https://www.163.com/dy/article/FS6AS7SS0518R7MO.html
https://docs.kernel.org/networking/msg_zerocopy.html

send() with MSG_ZEROCOPY

kernel v4.14 版本接受了来自 Google 工程师 Willem de Bruijn 在 TCP 网络报文的通用发送接口 send() 中实现的 zero-copy 功能
用户进程就能够把用户缓冲区的数据通过零拷贝的方式经过内核空间发送到网络套接字中去

因为前面几种零拷贝技术都是要求用户进程不能处理加工数据而是直接转发到目标文件描述符中去
Willem de Bruijn 在他的论文里给出的压测数据:
采用 netperf 大包发送测试,性能提升 39%,而线上环境的数据发送性能则提升了 5%~8%
官方文档陈述说这个特性通常只在发送 10KB 左右大包的场景下才会有显著的性能提升
一开始这个特性只支持 TCP,到内核 v5.0 版本之后才支持 UDP

这个功能的使用模式如下:
if (setsockopt(socket_fd, SOL_SOCKET, SO_ZEROCOPY, &one, sizeof(one)))
error(1, errno, “setsockopt zerocopy”);
ret = send(socket_fd, buffer, sizeof(buffer), MSG_ZEROCOPY);
// https://docs.kernel.org/networking/msg_zerocopy.html

第一步,先给要发送数据的 socket 设置一个 SOCK_ZEROCOPY option
第二步,在调用 send() 发送数据时再设置一个 MSG_ZEROCOPY option
其实理论上来说只需要调用 setsockopt() 或者 send() 时传递这个 zero-copy 的 option 即可
两者选其一,但是这里却要设置同一个 option 两次
官方的说法是为了兼容 send() API 以前的设计上的一个错误:send() 以前的实现会忽略掉未知的 option
为了兼容那些可能已经不小心设置了 MSG_ZEROCOPY option 的程序,设计成两步设置

猜测其他可能:
给使用者提供更灵活的使用模式,因为这个新功能只在大包场景下才可能会有显著的性能提升
现实场景很复杂:不仅仅是全部大包或者全部小包的场景,有可能是大包小包混合的场景
因此使用者可以先调用 setsockopt() 设置 SOCK_ZEROCOPY option
然后再根据实际业务场景中的网络包尺寸选择是否要在调用 send() 时使用 MSG_ZEROCOPY 进行 zero-copy 传输

注意:
send() 可能是异步发送数据,因此使用 MSG_ZEROCOPY 时,调用 send() 之后不能立刻重用或释放 buffer
因为 buffer 中的数据不一定已经被内核读走了,所以还需要从 socket 关联的队列里读取一下通知消息
看看 buffer 中的数据是否已经被内核读走

底层原理
这个技术是基于 redhat 红帽在 2010 年给 Linux 内核提交的 virtio-net zero-copy 技术之上实现的
通过 send() 把数据在用户缓冲区中的分段指针发送到 socket 中去
利用 page pinning <页锁定机制>锁住用户缓冲区的内存页
然后利用 DMA 直接在用户缓冲区通过内存地址指针进行数据读取,实现零拷贝
具体的细节可以通过阅读 Willem de Bruijn 的论文 (PDF)

主要缺陷:
(1) 只适用于大文件 (10KB 左右) 的场景,小文件场景因为 page pinning 页锁定和等待缓冲区释放的通知消息这些机制
甚至可能比直接 CPU 拷贝更耗时
(2) 因为可能异步发送数据,需要额外调用 poll() 和 recvmsg() 系统调用等待 buffer 被释放的通知消息,增加代码复杂度
以及会导致多次用户态和内核态的上下文切换;
(3) MSG_ZEROCOPY 目前只支持发送端,接收端暂不支持

绕过内核的直接 I/O
前面种种的 zero-copy 的方法,都是在想方设法地优化减少或者去掉用户态和内核态之间以及内核态和内核态之间的数据拷贝
为了实现避免这些拷贝可谓是八仙过海,各显神通,采用了各种各样的手段
那如果换个思路:这么费劲地去消除这些拷贝不就是因为有内核在掺和吗?

netpoll中的实现

初始化时的fd option设置

const (SO_ZEROCOPY       = 60SO_ZEROBLOCKTIMEO = 69MSG_ZEROCOPY      = 0x4000000
)func setZeroCopy(fd int) error {return syscall.SetsockoptInt(fd, syscall.SOL_SOCKET, SO_ZEROCOPY, 1)
}func setBlockZeroCopySend(fd int, sec, usec int64) error {return syscall.SetsockoptTimeval(fd, syscall.SOL_SOCKET, SO_ZEROBLOCKTIMEO, &syscall.Timeval{Sec:  sec,Usec: usec,})
}func (c *connection) init(conn Conn, opts *options) (err error) {... ...if setZeroCopy(c.fd) == nil && setBlockZeroCopySend(c.fd, defaultZeroCopyTimeoutSec, 0) == nil {c.supportZeroCopy = true}... ...
}

poll wait中的使用

仅关注 triggerWrite

// Wait implements Poll.
func (p 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/27358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue配置项之el

el 首先说明一下&#xff0c;本人是前端小学生级别的菜鸡&#xff0c;吐槽的话请口下留情&#xff0c;在评论区指出错误或者补充不足&#xff0c;我会很喜欢&#xff0c;互喷不会进步&#xff0c;相互指点才会。。。。谢谢大家啦 目录 el 目录示例原理 &#x1f4cc;Vue.…

与君共勉:坚持+努力

你若学不进去、玩不尽兴、睡不踏实、心情不爽、浑身不对劲却又食欲旺盛&#xff1b; 没有扎实基础却总犹豫不决&#xff1b; 渴望出类拔萃却难以脚踏实地&#xff1b; 看见别人勤奋就焦躁不安&#xff1b; 到自己行动时却总是明天再说。 要知道在一无所有的年纪&#xff0…

ERP管理系统解决方案(附ERP流程和详细解决方法)

ERP 是专门为制造企业设计的综合性管理解决方案&#xff0c;旨在优化制造业务流程&#xff0c;整合各个部门和环节&#xff0c;实现生产、供应链、质量控制和销售等方面的高效协同。 传统的制造行业会面临哪些业务痛点&#xff0c;会考虑erp解决方案&#xff1a; 生产成本高昂…

LeetCode452用最少数量的箭引爆气球

题目描述 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处…

华为数据驱动的企业数字化转型之路

华为数据驱动的企业数字化转型之路 数据驱动的数字化转型是企业未来发展的关键。通过构建完善的数据治理体系&#xff0c;包括差异化的数据管理、面向业务的信息架构、数据底座建设和自助数据服务&#xff0c;企业可以提升数据的利用效率和决策能力。本文将根据华为数据治理相…

Could not initialize class sun.awt.X11FontManager如何解决?

Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager这个错误信息指出了一个嵌套异常 java.lang.NoClassDefFoundError&#xff0c;并且无法初始化类 sun.awt.X11FontManager。这个问题通常与 J…

Idea多线程调试

在 IntelliJ IDEA 中调试多线程应用程序可能会有些复杂&#xff0c;因为多个线程可能会同时运行和交互。不过&#xff0c;IDEA 提供了一些强大的工具来帮助你进行多线程调试。以下是一些关键步骤和技巧&#xff0c;帮助你有效地调试多线程应用程序&#xff1a; 创建一个示例多线…

没有废话-MySQL,MyBatis 动态参数添加序号值(默认递增或根据内容进行递增)

创建数据 创建表 CREATE TABLE aml_inst_risk_assess_category (id int(11) NOT NULL AUTO_INCREMENT COMMENT ID,dept_id int(11) DEFAULT NULL COMMENT 机构id,dept_name varchar(30) DEFAULT NULL COMMENT 机构名称…

《精通ChatGPT:从入门到大师的Prompt指南》附录C:专业术语表

附录C&#xff1a;专业术语表 本附录旨在为读者提供一本全面的术语表&#xff0c;帮助理解《精通ChatGPT&#xff1a;从入门到大师的Prompt指南》中涉及的各种专业术语。无论是初学者还是高级用户&#xff0c;这些术语的定义和解释将为您在使用ChatGPT时提供重要参考。 A AI&…

Linux中Web服务器配置和管理(Apache)

文章目录 一、WEB服务器介绍1.1、WEB服务器概述1.2、WEB服务器的发展历史1.3、WEB服务器的优点与缺点1.4、WEB服务器的工作流程 二、Apache介绍2.1、Apache是什么2.2、Apache的发展史与应用场景2.3、Apache的特点2.4、Apache的工作原理2.5、Apache的模块 三、安装使用Apache服务…

调用百度API实现图像多主体检测

目录 1. 作者介绍2&#xff0e;百度API介绍与获取2.1 API介绍2.2 注册账号并获取API Key 3&#xff0e;完整实验代码&#xff0c;测试结果3.1 调用API3.2框出主体部分&#xff0c;并标注标签和置信度3.3 测试结果 1. 作者介绍 邓富贵&#xff0c;男&#xff0c;西安工程大学电…

【动态规划】| 详解路径问题之地下城游戏 力扣174 (困难题)

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️专栏&#xff1a;动态规划 &#x1f397;️如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/minimum-path-sum/description/ 建议先看一下前面…

Character Region Awareness for Text Detection论文学习

​1.首先将模型在Synth80k数据集上训练 Synth80k数据集是合成数据集&#xff0c;里面标注是使用单个字符的标注的&#xff0c;也就是这篇文章作者想要的标注的样子&#xff0c;但是大多数数据集是成堆标注的&#xff0c;也就是每行或者一堆字体被整体标注出来&#xff0c;作者…

一期人工湖球机

192.168.66.126 admin a123456 在16号录像机上192.168.66.213 固定位置在15号楼定西北角

手把手教你安装 Vivado2022.2(附安装包)

​一、Vivado 2022.2 优势 Vivado 2022.2版本与之前的版本相比&#xff0c;具有以下几个显著的优势&#xff1a; 电源设计管理器&#xff08;PDM&#xff09;&#xff1a;Vivado 2022.2引入了全新的电源设计管理器&#xff08;PDM&#xff09;&#xff0c;这是一个下一代功耗评…

LeetCode | 58.最后一个单词的长度

这道题要求最后一个单词的长度&#xff0c;第一个想到的就是反向遍历字符串&#xff0c;寻找最后一个单词并计算其长度。由于尾部可能会有’ &#xff0c;所以我们从后往前遍历字符串&#xff0c;找到第一个非空格的字符&#xff0c;然后记录下到下一个空格前依次有多少个字母即…

python全栈开发《05.环境搭建与脚本结构之python中的关键字》

1.什么是关键字 在中国古代&#xff0c;像皇帝&#xff0c;还有官员的官职&#xff0c;他们的官称不同&#xff0c;所执行的工作内容也并不相同。 那么python里面的关键字就像朝廷里面官员的头衔一样被python所内定。并且起到各自的功能。朝廷的官员是为了国家的运转而存在的。…

【思维导图工具】Xmind 2024安装教程+软件安装包下载

​XMind 2022是一款风靡全宇宙的思维导图和头脑暴炸软件&#xff0c;是全宇宙领先的“可视化思考”工具&#xff0c;每一个功能都能帮助你激发灵感、提高创造力。 XMind 2022为不同的使用场景提供多种可视化布局&#xff0c;让你的思维可以更清晰的结构化呈现&#xff0c;该软件…

MySQL学习——在用Connector/NET处理BLOB数据

MySQL的一个常见用途是将二进制数据存储在BLOB列中。MySQL支持四种不同的BLOB数据类型&#xff1a;TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB&#xff0c;所有这些都在BLOB and TEXT Types和 Data Type Storage Requirements中进行了描述。 存储在BLOB列中的数据可以使用MySQL Co…

Apollo9.0 PNC源码学习之Control模块(二)—— controller解析

前面文章&#xff1a;Apollo9.0 PNC源码学习之Control模块&#xff08;一&#xff09; 本文将对具体控制器以及原理做一个剖析 1 PID控制器 1.1 PID理论基础 如下图所示&#xff0c;PID各参数(Kp,Ki,Kd)的作用&#xff1a; 任何闭环控制系统的首要任务是要稳、准、快的响…