新一代网络框架UringNet,基于最新的异步I/O

介绍

在这里插入图片描述

在去年的一篇文章中,笔者曾经提到了最新一代的网络I/O框架UringNet。具体内容可以参考Rings’ Power,性能“世界第一”的Web I/O框架。这是基于最新Linux内核的异步I/O组件io_uring开发的网络框架。由于采用了最新的异步框架,因此在同等硬件配置条件下,UringNet比目前性能最好的基于select/epoll的框架的网络I/O的峰值数据还要高10%以上。目前,已经将该框架开源https://github.com/y001j/UringNet,有兴趣的读者可以进行尝试,如果有任何问题也可以联系作者进行讨论。

io_uring是一个全新设计的Linux异步I/O框架,通过合理设计并对参数进行合理调整,能够达到非常高的性能,尤其在不需要缓存的硬件和磁盘I/O中有非常好的表现,例如RockDB中就加入了对于io_uring的支持。但是将io_uring应用到高性能的网络框架中确实一个比较有挑战的领域。这是由于网络访问通常需要依赖操作系统的网络栈,以及读写缓存,而缓存机制又会涉及到内核态和有用户态的切换。此前和其他开发者交流,往往认为在高性能网络I/O领域可能并不适合采用io_uring。不过通过UringNet的实践来看,io_uring的不但适合用于网络I/O,而且还能够获得非常不错的性能。

对于io_uring的介绍,在这里就不再进行详细介绍了,下面列出了对这个技术的参考文档:

  • Lord of the io_uring
  • Ringing in a new asynchronous I/O API
  • An Introduction to the io_uring Asynchronous I/O Framework (oracle.com)
  • io_uring.pdf (kernel.dk)
  • Linux高性能异步I/O接口io_uring

为什么我创建了这个项目?

UringNet是一个高性能和轻量级的网络I/O框架。使用Golang语言开发。UringNet是基于Linux内核版本5.1引入的最新新异步I/O接口io_uring开发的。这个项目最初来自于我在边缘计算和物联网研究中的实验性项目。我最初想找到一种方法来构建一个简单但高性能的网络数据传输工具,用于物联网网关。我开始的时候尝试传统的select/epoll,然后测试了io_uring在物联网数据传输的表现,发现io_uring性能更好。

是否应该在你的项目中?

尽管UringNet最初是为物联网平台设计的,但它也提供了基本的TCP和UDP网络功能。如果你的项目确实需要处理超大的数据流量,你可以尝试使用它。
在大多数情况下,你可能只需使用更成熟的网络框架,例如Go的net/http、Netty或libuv。

入门指南

UringNet参考了现有的网络框架,如gnet和Netty等,某些使用模式与gnet非常相似。请注意,UringNet基于io_uring,因此需要在运行在内核版本高于或等于5.1的Linux操作系统中。
如何使用这个框架,简单的echo程序:

package mainimport ("github.com/y001j/UringNet"socket "github.com/y001j/UringNet/sockets""os""sync"
)type testServer struct {UringNet.BuiltinEventEnginetestloop *UringNet.Ringloop//ring      *uring_net.URingNetaddr      stringmulticore bool
}// OnTraffic 
//  
//	@Description: OnTraffic is a hook function that runs every read event completed
//	@receiver ts
//	@param data
//	@return uring_net.Action
func (ts *testServer) OnTraffic(data *UringNet.UserData, ringnet UringNet.URingNet) UringNet.Action {data.WriteBuf = data.Bufferreturn UringNet.Echo
}func (ts *testServer) OnWritten(data UringNet.UserData) UringNet.Action {return UringNet.None
}func (ts *testServer) OnOpen(data *UringNet.UserData) ([]byte, UringNet.Action) {return nil, UringNet.None
}func main() {addr := os.Args[1]options := socket.SocketOptions{TCPNoDelay: socket.TCPNoDelay, ReusePort: true}ringNets, _ := UringNet.NewMany(UringNet.NetAddress{socket.Tcp4, addr}, 3200, true, runtime.NumCPU(), options, &testServer{}) //runtime.NumCPU()loop := UringNet.SetLoops(ringNets, 3000)var waitgroup sync.WaitGroupwaitgroup.Add(1)loop.RunMany()waitgroup.Wait()
}

警告:该项目仍在开发中,可能存在一些bug和性能问题。如果您发现任何错误或有任何建议,请随时提出问题。邮箱rocky@yangjian.co

提示:

  1. 在我们使用wrk进行性能测试时,我们观察到UringNet在进行HTTP压力测试时需要一个预热时间。通常情况下,需要约5分钟的预热(用wrk预先压测5分钟),以确保UringNet测试代码达到其性能峰值。目前还不太清楚为什么io_uring需要预热才能够达到压测峰值性,该问题任然在研究中。
  2. UringNet的性能表现和参数设置密切相关,主要影响的参数有,
    1. 线程数num,用于设定启用的io_uring实例数量,一般设置为(CPU总数±1)。
    2. sqpoll这个参数通常设置为true能够达到更好的性能,不过CPU占用会上升。
    3. size指的是SQ的大小,也就是输入队列的大小,如果这个值过小,有可能会报错。
// NewMany Create multiple uring instances
//
//	@Description:
//	@param addr
//	@param size set SQ size
//	@param sqpoll if set sqpoll to true, io_uring submit SQs automatically  without enter syscall.
//	@param num number of io_uring instances need to be created
//	@return *[]URingNet
//	@return error
UringNet.NewMany(UringNet.NetAddress{socket.Tcp4, addr}, 3200, true, runtime.NumCPU(), options, &testServer{})

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

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

相关文章

漏洞扫描环境:win10系统用VMware Workstation打开虚拟机若干问题

win10系统用VMware Workstation打开虚拟机若干问题 一 .VMware打开虚拟机就蓝屏重启怎么解决?一. VMware打开虚拟机就蓝屏重启怎么解决?方法一:1、同时按下CTRLSHIFTESC打开任务管理器功能,之后依次点击-详细信息-性能后出现下列界…

【GPU常见概念】GPU常见概念及分类简述

随着大模型和人工智能的爆火,大家对GPU的关注持续上升,本文简单简述下GPU经常用的概念。 GPU(图形处理器),又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备&…

k8s 拉取镜像报错 no basic auth credentials

文章目录 [toc]基于现有凭据创建 Secret通过命令行创建 Secretpod 使用指定 secret 认证私有镜像仓库 省流提醒: 本次解决的问题是 docker login 可以正常登录,docker pull 也可以正常拉取镜像,只是 k8s 在启动 pod 的时候,没有指…

【Java-LangChain:面向开发者的提示工程-3】迭代优化

第三章 迭代优化 当使用 LLM 构建应用程序时,实践层面上很难第一次尝试就成功获得适合最终应用的 Prompt。但这并不重要,只要您有一个好的迭代过程来不断改进您的 Prompt,那么您就能够得到一个适合任务的 Prompt。虽然相比训练机器学习模型&…

辅助驾驶功能开发-测试篇(2)-真值系统介绍

1 真值系统概述 1.1 真值评测系统核心应用 快速构建有效感知真值,快速完成感知性能评估,快速分析感知性能缺陷。 主要应用场景包括: 1. 感知算法开发验证: 在算法开发周期中,评测结果可以作为测试报告的一部分,体现算法性能的提升。 2. 遴选供应…

九、2023.10.3.Linux(end).9

文章目录 33、简述mmap的原理和使用场景?34、互斥量能不能在进程中使用?35、协程是轻量级线程,轻量级表现在哪里?36、说说常见信号有哪些,表示什么含义?37、说说线程间通信的方式有哪些?38、说说…

关于使用 uniapp Vue3 开发分享页面 语法糖 setup 开发获取ref踩坑

上代码 前端代码 <!-- 分享弹出 --> <uni-popup ref"share" type"share" safeArea backgroundColor"#fff"><uni-popup-share></uni-popup-share> </uni-popup>处理函数 import {onNavigationBarButtonTap} from…

点击router-link时候会发生什么?

当你点击链接或按钮时&#xff0c;将会导航到 User 组件&#xff0c;就会显示相应的用户 ID。 这里说一下执行流程&#xff0c;当点击一个 router-link 时&#xff0c;Vue Router会执行以下流程&#xff1a; 1&#xff09;点击事件触发: 当你点击 router-link 组件时&#xf…

【Java 进阶篇】JDBC查询操作详解

在数据库编程中&#xff0c;查询是一项非常常见且重要的操作。JDBC&#xff08;Java Database Connectivity&#xff09;提供了丰富的API来执行各种类型的查询操作。本篇博客将详细介绍如何使用JDBC进行查询操作&#xff0c;包括连接数据库、创建查询语句、执行查询、处理结果集…

python——Django框架

一、基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容&#xff0c;并进一步开发出全功能的 Web 服务 Django 本身基于 MVC …

AttributeError: module ‘dgl‘ has no attribute ‘batch_hetero‘

DGLWarning: From v0.5, DGLHeteroGraph is merged into DGLGraph. You can safely replace dgl.batch_hetero with dgl.batch

MySQL索引:结构、语法、分类和优化

MySQL索引是数据库中非常关键的性能优化手段。它们提供了快速访问数据的方法&#xff0c;同时也可以极大地提高查询效率。本文将深入介绍MySQL索引的结构、语法、分类&#xff0c;以及如何使用Profile和EXPLAIN来优化查询性能&#xff0c;带有详细的实例演示。 索引结构 MySQ…

【Pytorch笔记】4.梯度计算

深度之眼官方账号 - 01-04-mp4-计算图与动态图机制 前置知识&#xff1a;计算图 可以参考我的笔记&#xff1a; 【学习笔记】计算机视觉与深度学习(2.全连接神经网络) 计算图 以这棵计算图为例。这个计算图中&#xff0c;叶子节点为x和w。 import torchw torch.tensor([1.]…

SpringMVC的@InitBinder的作用

一、前言 在SpringMVC中&#xff0c;InitBinder注解用于自定义数据绑定的方法。在使用表单提交数据时&#xff0c;SpringMVC会将请求参数绑定到Java对象中。但是&#xff0c;有些时候请求参数的数据格式可能与Java对象的属性格式不一致&#xff0c;这时就需要使用InitBinder注…

JavaScript内置对象 - Array数组(四)- 序列生成器

序列生成器是生成一个指定起始值和结束值的序列&#xff0c;并且根据指定间隔长度&#xff0c;生成序列数组。 完成此功能需要使用到Array内置对象的from()对象&#xff0c;以及类数组相关知识&#xff0c;前面几篇有相关案例进行演示。 地址一&#xff1a;JavaScript内置对象…

基于.Net Core实现自定义皮肤WidForm窗口

前言 今天一起来实现基于.Net Core、Windows Form实现自定义窗口皮肤&#xff0c;并实现窗口移动功能。 素材 准备素材&#xff1a;边框、标题栏、关闭按钮图标。 窗体设计 1、创建Window窗体项目 2、窗体设计 拖拉4个Panel控件&#xff0c;分别用于&#xff1a;标题栏、关…

【Redis】基础数据结构-字典

Redis 字典 基本语法 字典是Redis中的一种数据结构&#xff0c;底层使用哈希表实现&#xff0c;一个哈希表中可以存储多个键值对&#xff0c;它的语法如下&#xff0c;其中KEY为键&#xff0c;field和value为值&#xff08;也是一个键值对&#xff09;&#xff1a; HSET key…

基于SSM农产品商城系统

基于SSM农产品商城系统的设计与实现&#xff0c;前后端分离&#xff0c;文档 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 农产品列表 产品详情 个人中心 登陆界面 管…

以太网基础学习(二)——ARP协议

一、什么是MAC地址 MAC地址&#xff08;英语&#xff1a;Media Access Control Address&#xff09;&#xff0c;直译为媒体访问控制位址&#xff0c;也称为局域网地址&#xff08;LAN Address&#xff09;&#xff0c;MAC位址&#xff0c;以太网地址&#xff08;Ethernet Addr…

【算法训练-字符串 三】字符串相加

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【字符串相加】&#xff0c;使用【字符串】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…