CloudWeGo-Netpoll:高性能NIO网络库浅析
一、Netpoll 简介
Netpoll 是由字节跳动开发的高性能 NIO(Non-blocking I/O)网络库,专注于 RPC 场景。在 RPC 场景中,通常有较重的处理逻辑,无法串行处理 I/O。而 Go 的标准库 net
设计了 BIO(Blocking I/O)模式的 API,在高并发下会产生大量的 goroutine,大幅增加调度开销。此外,net.Conn
没有提供检查连接活性的 API,使得 RPC 框架很难设计出高效的连接池。Netpoll 应运而生,借鉴了 evio
和 netty
的优秀设计,具有出色的性能,更适用于微服务架构。
二、Netpoll 与 Go net 的区别
2.1 I/O 模式
- Go net:使用阻塞 I/O(BIO)模式。在处理网络连接时,通常为每个连接分配一个 goroutine,当进行 I/O 操作时,线程会被阻塞,直到操作完成。例如,在服务端使用
net.Listen
创建监听套接字,客户端使用net.Dial
发起连接请求,读写数据时使用conn.Read
和conn.Write
方法,这些方法在没有数据或空间时会阻塞线程。
// 服务端监听
ln, err := net.Listen("tcp", "localhost:8080")
// 客户端连接
conn, err := net.Dial("tcp", "localhost:8080")
// 数据读取
buf := make([]byte, 1024)
n, err := conn.Read(buf)
// 数据写入
data := []byte("Hello, World!")
n, err := conn.Write(data)
- Netpoll:使用非阻塞 I/O(NIO)模式。通过操作系统的 I/O 多路复用机制(如 epoll),可以避免线程阻塞,提高系统的并发处理能力。服务端使用
EventLoop
和CreateListener
创建监听套接字,客户端使用Dialer
和DialTimeout
发起连接请求,读写数据时使用Reader
和Writer
接口,数据不足或空间不足时不会阻塞线程。
// 服务端创建监听
ln, err := CreateListener("tcp", address)
// 客户端创建连接
dialer := NewDialer()
conn, err := dialer.DialTimeout("tcp", address, time.Second)
// 数据读取
buf, _ := reader.Next(n)
reader.Release()
// 数据写入
alloc, _ := writer.Malloc(len(write_data))
copy(alloc, write_data)
writer.Flush()
2.2 数据读写方式
- Go net:在读写数据时通常需要进行数据复制。例如,在读取多个数据包时,需要将数据从读取缓冲区复制到新的内存区域。
var conn net.Conn
var buf = make([]byte, 8192)
for {n, _ := conn.Read(buf)var pkgsize = 1024var i intfor i = 0; i <= n-pkgsize; i += pkgsize {pkg := append([]byte{}, buf[i:i+pkgsize]...)go func() {// 处理数据包}()}buf = append(buf[:0], buf[i:n]...)
}
- Netpoll:提供了 nocopy API,支持直接操作 buffer 的原地址,减少数据复制。通过
Reader.Slice
方法可以直接从LinkBuffer
中获取数据,而不需要进行复制。
var conn netpoll.Connection
reader := conn.Reader()
var pkgsize = 1024
for {pkg, _ := reader.Slice(pkgsize)go func() {// 处理数据包pkg.Release()}()
}
2.3 连接管理
- Go net:没有提供直接检查连接活性的 API。当连接不再使用时,需要调用
conn.Close
方法关闭连接。
conn.Close()
- Netpoll:提供了
IsActive
方法检查连接是否存活,并且支持添加关闭回调函数。可以及时清理失效连接,提高连接池的效率。
conn.AddCloseCallback(func(connection Connection) error {// 连接关闭时执行操作return nil
})
三、为什么要设计 Netpoll
3.1 高并发场景下的性能问题
在高并发场景下,Go net 的 BIO 模式会为每个连接分配一个 goroutine,导致大量的 goroutine 创建和调度,增加系统的资源消耗和调度开销。而 Netpoll 的 NIO 模式可以使用较少的线程处理大量的连接,减少线程切换开销,提高性能。
3.2 高效连接池的需求
Go net 的 net.Conn
没有提供检查连接活性的 API,使得 RPC 框架很难设计出高效的连接池,池中的失效连接无法及时清理。Netpoll 提供了 IsActive
方法和关闭回调函数,方便应用程序管理连接状态,及时清理失效连接。
3.3 数据处理效率的提升
在处理大量数据时,Go net 的数据复制会增加内存开销和 CPU 负担,降低数据读写效率。Netpoll 的 nocopy API 可以减少数据复制的开销,提高数据读写效率。
四、Netpoll 的实现方式
4.1 非阻塞 I/O 机制
Netpoll 利用操作系统的 I/O 多路复用机制(如 epoll),将监听套接字和连接套接字加入到内核的 I/O 多路复用机制中。当有数据可读或可写时,内核会通知 Netpoll,Netpoll 再进行相应的处理,避免了线程阻塞。
4.2 nocopy API
Netpoll 的 LinkBuffer
提供了 nocopy API,支持直接操作 buffer 的原地址。通过偏移量的方式区分不同的请求数据,减少了不必要的数据复制。例如,Reader.Slice
方法直接从 LinkBuffer
中获取一个大小为指定值的切片,这个切片是通过偏移量的方式从 LinkBuffer
中划分出来的,并没有进行数据的复制。
4.3 连接管理
Netpoll 提供了 IsActive
方法检查连接是否存活,并且支持添加关闭回调函数。在连接关闭时,会执行相应的回调函数,方便应用程序进行资源清理。
五、优劣势分析
5.1 Netpoll 的优势
- 高性能:在高并发场景下,Netpoll 的非阻塞 I/O 模式和 nocopy API 可以减少线程切换开销和数据复制开销,提高系统的并发处理能力和数据读写效率。
- 高效连接管理:提供了
IsActive
方法和关闭回调函数,方便应用程序管理连接状态,及时清理失效连接,提高连接池的效率。 - 适用于 RPC 场景:专注于 RPC 场景,满足 RPC 场景中较重处理逻辑和高效连接管理的需求。
5.2 Netpoll 的劣势
- 学习成本较高:相比 Go net,Netpoll 的 API 和实现机制较为复杂,需要开发者花费更多的时间来学习和掌握。
- 不支持 Windows 系统:目前 Netpoll 不支持 Windows 操作系统,限制了其在某些场景下的使用。
5.3 Go net 的优势
- 简单易用:Go net 的 API 设计简单,易于理解和使用,适合简单场景下的网络编程。
- 广泛的兼容性:Go net 是 Go 语言的标准库,具有广泛的兼容性,适用于各种操作系统和场景。
5.4 Go net 的劣势
- 高并发性能差:在高并发场景下,Go net 的 BIO 模式会导致大量的 goroutine 创建和调度,增加系统的资源消耗和调度开销。
- 数据处理效率低:读写数据时需要进行数据复制,增加了内存开销和 CPU 负担,降低了数据读写效率。
六、总结
Netpoll 在高并发场景下具有明显的性能优势,适合处理大量连接和数据的 RPC 场景。而 Go net 在简单场景下使用更加方便,代码实现简单。开发者可以根据具体的应用场景选择合适的网络库。如果是高并发的 RPC 场景,建议使用 Netpoll;如果是简单的网络编程场景,Go net 是一个不错的选择。
相关文章:
CloudWeGo-Netpoll:高性能NIO网络库浅析
一、Netpoll 简介 Netpoll 是由字节跳动开发的高性能 NIO(Non-blocking I/O)网络库,专注于 RPC 场景。在 RPC 场景中,通常有较重的处理逻辑,无法串行处理 I/O。而 Go 的标准库 net 设计了 BIO(Blocking I/…...
Mac的显卡架构种类
目录 一、Intel架构时期的Mac显卡(2006 年至 2020 年) 1. Intel 集成显卡(iGPU) 2. 独立显卡(dGPU)—— AMD 和 NVIDIA (1)AMD Radeon(主流独显选择) &a…...
HTTP基本概述
HTTP基本概述 报文格式 HTTP报文分为 请求报文 和 响应报文 一、请求报文 请求行(Request Line)请求头部(Request Headers)(空行)请求体(Request Body) ← 可选,如 P…...

Canvas SVG BpmnJS编辑器中Canvas与SVG职能详解
Canvas详解与常见API 一、Canvas基础 核心特性 • 像素级绘图:Canvas是基于位图的绘图技术,通过JavaScript操作像素实现图形渲染,适合动态、高性能场景(如游戏、数据可视化)。 • 即时模式:每次绘制需手动…...

dify多实例部署,一台机器部署多个dify实例
dify多实例部署 目的 实现在一台机器上,部署多个dify的实例。比如一个部署1.2版本,一个部署1.3版本。废话没有,直接上干货。 前提 你的电脑已经部署了一个dify实例,并成功运行。比如已经部署成功0.15.3版本。 步骤如下&#…...

ML 48.机器学习之临床生存树(rpartSurv)
简介机器学习中生存树(Survival Tree)的原理详解 生存树是结合决策树与生存分析的机器学习模型,主要用于处理带有时间-事件数据(包含删失数据)的预测问题。其核心目标是:通过树状结构对数据进行递归分割&am…...

HarmonyOS 应用开发,如何引入 Golang 编译的第三方 SO 库
本指南基于笔者临时修复的 ohos_golang_go 项目fork,解决HO 应用导入 cgo编译产物时的 crash 问题。 1. 下载 ohos_golang_go git clone https://gitcode.com/deslord/ohos_golang_go.git📌 该仓库为笔者临时修复版本,修复了 CGO 编译模式下…...
Axure元件动作六:设置图片
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 案例视频: Axure元件动作:设置图片 课程主题:设置图片 主要内容:图片悬停、鼠标按下时、选中...

一体化雷达波明渠流量计简介
一、技术定义与核心原理 一体化雷达波明渠流量计是基于微波技术的全自动流量监测设备,采用 24G K 波段平面雷达技术,通过非接触式测量方式实现对明渠、河道、排水管网等场景的水位、流速及流量监测。其核心原理是利用雷达发射高频电磁波,经水…...

Pr -- 耳机没有Pr输出的声音
问题 很久没更新视频号了,想用pr剪辑一下,结果使用Pr打开后发现耳机没有Pr输出的声音 解决方法 在编辑--首选项-音频硬件中设置音频硬件的输出为当前耳机设备...

白皮精读:2024年国家数据基础设施建设指引【附全文阅读】
《国家数据基础设施建设指引》提出建设覆盖数据采集至安全全链条的新型基础设施,目标到 2029 年形成横向联通、纵向贯通的格局,聚焦数据可信流通、算力协同、高速传输、安全保障四大功能,明确技术架构与重点方向,强调政府与市场协同,分阶段推进试点及规模化部署,为数字中…...
【信息系统项目管理师】第21章:项目管理科学基础 - 23个经典题目及详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1~2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第21题】…...
Mocha-Webpack 使用教程
Mocha-Webpack 使用教程 mocha-webpackmocha test runner with integrated webpack precompiler项目地址:https://gitcode.com/gh_mirrors/mo/mocha-webpack 项目介绍 Mocha-Webpack 是一个结合了 Mocha 和 Webpack 的测试工具,它允许开发者在使用 Webpack 打包的…...
AI硬件革命:OpenAI“伴侣设备”——从概念到亿级市场的生态重构
2025年5月23日,OpenAI宣布以65亿美元全股收购苹果前首席设计师Jony Ive创立的AI硬件公司io,并计划于2026年底前推出首款“AI伴侣设备”,目标出货量达1亿台。这一消息迅速成为全球AI领域的热点,标志着AI技术从云端大模型向端侧硬件…...

穿屏技巧:Mac-Windows一套鼠标键盘控制多台设备 (sharemouse6.0-Keygen)| KM-401A
文章目录 引言I sharemouse6.0介绍功能介绍关闭自动更新安装包II 安装系统对应的sharemouse软件Windowsmac版本III 知识扩展:SCP、FTP、SSH文件传输SCP配置SSH密钥免密登录FTP(File Transfer Protocal,文件传输协议)引言 基于USB进行同步键盘和鼠标事件,更流畅。 基于局域…...

【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化
目录 前言 一、空间检索简介 1、空间表结构 2、四至空间检索 二、前后端实现 1、后端实现 2、前端集成 三、成果展示 1、东部省份 2、西部省份 3、南部省份 4、北部省份 5、中部省份 四、总结 前言 在当今数字化时代,地理信息数据的分析与可视化对于众…...
【C/C++】线程状态以及转换
文章目录 线程状态以及转换1 基本状态1.1 新建(New)1.2 就绪(Ready / Runnable)1.3 运行中(Running)1.4 阻塞/等待(Blocked / Waiting / Sleeping)1.5 挂起(Suspended&am…...
从零开始:Python语言进阶之异常处理
一、认识异常:程序运行中的“意外事件” 在编写Python程序时,即使代码语法完全正确,运行过程中也可能遭遇各种意外情况。这些意外被称为异常,它们会打断程序的正常执行流程。例如,当我们尝试打开一个不存在的文件、用0…...
关于vue彻底删除node_modules文件夹
Vue彻底删除node_modules的命令 vue的node_modules文件夹非常大,常规手段根本无法删除. 解决方法: 在node_modules文件夹所在的路径运行命令窗口,并执行下面的命令. npm install rimraf -g rimraf node_modules说明: npm install rimraf -g 该命令是安装 node…...

如何制作可以本地联网搜索的MCP,并让本地Qwen3大模型调用搜索回答用户问题?
环境: SearXNG Qwen3-32B-FP8 vllm 0.8.5 问题描述: 如何制作可以本地联网搜索的MCP,并让本地Qwen3大模型调用搜索回答用户问题? 解决方案: 一、安装searxng 1.按需新建模型相关文件夹 mkdir MCP chmod 777 /mnt/program/MCP2.配置conda源 nano ~/.condarc nano…...

服务器硬盘虚拟卷的处理
目前的情况是需要删除逻辑卷,然后再重新来弄一遍。 数据已经备份好了,所以不用担心数据会丢失。 查看服务器的具体情况 使用 vgdisplay 操作查看服务器的卷组情况: --- Volume group ---VG Name vg01System IDFormat …...

一个国债交易策略思路
该国债交易策略的核心在于通过分析历史价格数据来识别市场趋势,并在趋势确认时进行开仓操作。策略的设计思路结合了价格波动范围的计算和市场波动性的评估,旨在捕捉市场的短期趋势并控制风险。 首先,策略通过对过去5根K线的最高价和最低价进行…...
Linux常用下载资源命令
wget命令 基本用法 wget -O http://example.com/file.zip-O 参数表示将文件保存为原始文件名。 如果需要指定文件名,可以使用 -o 参数: wget -o custom_name.zip http://example.com/file.zip-P :指定下载文件的保存路径。 wget -P /path/…...
Go语言爬虫系列教程(三)HTML解析技术
第3课:HTML解析技术 在上一章中,我们使用正则表达式提取网页内容,但这种方法有局限性。对于复杂的HTML结构,我们需要使用专门的HTML解析库。下面将介绍如何在Go中解析HTML。 1. HTML DOM树结构介绍 1.1 什么是DOM DOM…...

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球
【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球 文章目录 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球前言高斯函数一维高斯多维高斯 椭球基本定义一般二次形式 3D高斯椭球3D高斯与椭球的关系各向同性(Isotropic)和…...
“夹子音”的发声原理和潜在风险
关于“夹子音”的发声原理和潜在风险,以下从科学角度和声乐实践出发,为你详细解析: 一、什么是夹子音? 夹子音是近年来网络流行的非专业术语,指通过刻意挤压喉部、改变共鸣腔形态发出的 尖细、嗲气、幼态化 的声音。常…...
思科硬件笔试面试题型解析
本专栏预计更新60期左右。当前第13期 这个系列通过在各类网上搜索大厂公开的笔试和面试题目,然后构造相关的知识点矩阵,让大家对核心的知识点有更深的认识,这个过程虽然耗时费力,但大厂的很多题目(包括模拟题)确实非常巧妙,很有代表性。由于官方没有发布过这样的题库,所…...

手写ES6 Promise() 相关函数
手写 Promise() 相关函数: Promise()、then()、catch()、finally() // 定义三种状态常量 const PENDING pending const FULFILLED fulfilled const REJECTED rejectedclass MyPromise {/*定义状态和结果两个私有属性:1.使用 # 语法(ES2022 官方私有字…...
Windows 平台 TCP 通信开发指南
开篇介绍 在 Windows 平台进行 TCP 通信开发,是网络编程中的常见需求。本文将详细讲解在 Windows 平台下,如何利用 Winsock API 实现高效的 TCP 客户端与服务端通信。 使用示例 必须引入的头文件 #include <windows.h> #pragma comment(lib,&q…...

【NLP 76、Faiss 向量数据库】
压抑与痛苦,那些辗转反侧的夜,终会让我们更加强大 —— 25.5.20 Faiss(Facebook AI Similarity Search)是由 Facebook AI 团队开发的一个开源库,用于高效相似性搜索的库,特别适用于大规模向…...