网络框架netpoll中的SO_ZEROCOPY

server/2024/10/22 7:21:20/

背景了解

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.ppmy.cn/server/48260.html

相关文章

2021 hnust 湖科大 操作系统课设 报告+原代码+指导书+流程图源文件

2021 hnust 湖科大 操作系统课设 报告原代码指导书流程图源文件 详情 目录 验证类实验&#xff1a; 1 实验一&#xff1a;Windows进程管理 1 一、 实验题目&#xff1a; 1 二、 实验目的 1 三、 实验内容 1 四、 实验结果与分析 2 五、 小结与心得体会 5 实验二&#xff1a;L…

综合型驱鸟装置:光伏电站集束冲击波驱鸟器

光伏电站作为绿色、清洁的能源生产方式&#xff0c;正在全球范围内得到快速发展。在光伏电站的建设和运营过程中&#xff0c;鸟类活动所带来的影响逐渐凸显&#xff0c;成为电站管理者需要面对的重要问题。在此背景下&#xff0c;光伏电站驱鸟器的需求也不断增长。 目前市场上的…

系统提示xlive.dll丢失有什么解决办法?详细解决办法介绍

如果你曾经在玩那些超酷的大型游戏时遇到过xlive.dll文件丢失的问题&#xff0c;那么你来对地方了&#xff01;这篇文章将带你一步步学习如何修复这个烦人的xlive.dll文件缺失问题。不仅如此&#xff0c;我们还会分享一些超级重要的注意事项&#xff0c;确保在修复过程中不会引…

Spring Boot 常用注解

1. 启动类注解 SpringBootApplication: 它是 Spring Boot 的核心注解&#xff0c;包含了 SpringBootConfiguration、EnableAutoConfiguration 和 ComponentScan 三个注解。SpringBootConfiguration&#xff1a;标注当前类为配置类&#xff0c;类似于 Spring 的 Configuration 注…

使用JMeter软件压测接口配置说明

1、下载完该软件https://blog.csdn.net/wust_lh/article/details/86095924 2.点击bin文件中jmeter.bat脚本https://blog.csdn.net/wust_lh/article/details/86095924 3.官网地址https://jmeter.apache.org/download_jmeter.cgi 通过 【Options】->【Choose Language】变更为…

使 C# 定义的接口能够被 Java 客户端调用

要使 C# 定义的接口能够被 Java 客户端调用&#xff0c;需要确保你的 C# 应用程序能够通过 HTTP 请求对外暴露 API&#xff0c;并且正确配置服务器和项目设置。以下是具体步骤&#xff1a; 1. 确保 C# API 可供访问 确认 C# API 是可通过 HTTP 访问的&#xff0c;通常使用 ASP…

Java语言+前端框架html+Thymeleaf +后端框架springboot开发的UWB智能定位系统源码 UWB三维可视化人员定位系统源码

Java语言前端框架htmlThymeleaf 后端框架springboot开发的UWB智能定位系统源码 UWB三维可视化人员定位系统源码 UWB定位系统基于B/S架构的软件和嵌入式硬件都具有很好的扩展性和兼容性&#xff0c;可以与其他系统接口&#xff08;比如&#xff1a;围界、AB门、高压电网、报警、…

2024全国高考作文题解读(Chat GPT 4.0版本)

新课标I卷 阅读下面的材料&#xff0c;根据要求写作。&#xff08;60分&#xff09; 随着互联网的普及、人工智能的应用&#xff0c;越来越多的问题能很快得到答案。那么&#xff0c;我们的问题是否会越来越少&#xff1f; 以上材料引发了你怎样的联想和思考&#xff1f;请写…